热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何正确映射模糊处理程序方法?

我正在学习有关SpringBoot的信息,我有以下代码:@GetMapping(value"testproduits{prixL

我正在学习有关Spring Boot的信息,我有以下代码:

@GetMapping(value = "test/produits/{prixLimit}")
public List testeDeRequetes(@PathVariable int prixLimit) {
return productDao.findByPrixGreaterThan(400);
}
@GetMapping(value = "test/produits/{recherche}")
public List testeDeRequetes(@PathVariable String recherche) {
return productDao.findByNameLike("%"+recherche+"%");
}

第一种方法是使用过滤器进行搜索。
第二个是没有过滤器的搜索。

最后我遇到这个错误:

Ambiguous handler methods mapped for '/test/produits/300': {public java.util.List com.ecommerce.microcommerce.web.controller.ProductController.testeDeRequetes(int),public java.util.List com.ecommerce.microcommerce.web.controller.ProductController.testeDeRequetes(java.lang.String)}


我想您可以使用正则表达式来区分这些方法。

@GetMapping(value = "test/produits/{prixLimit:[\\d]+}")
public List testeDeRequetes(@PathVariable int prixLimit) {
return productDao.findByPrixGreaterThan(400);
}
@GetMapping(value = "test/produits/{recherche:[A-z]}")
public List testeDeRequetes(@PathVariable String recherche) {
return productDao.findByNameLike("%"+recherche+"%");
}

以下是示例(第4.3。@ PathVariable with RegEx):

https://www.baeldung.com/spring-requestmapping#3-pathvariable-with-regex

,

我认为您的API从根本上来说是模棱两可的。作为消费者,相同的动词+路径会使我感到困惑。

还有一点限制。例如,通过您的设置,您可以阻止用户搜索“ 123”(也许是产品ID或SKU)。

prixLimitrecherche参数似乎是产品资源上的过滤器/查询,因此将它们作为查询参数而不是路径进行传递更有意义:

@GetMapping(value = "test/produits/")
public List testeDeRequetes(@RequestParam(name = "prixLimit",required = false) Integer prixLimit,@RequestParam(name = "recherche",required = false) String recherche {
// if prixLimit is not null
// return productDao.findByPrixGreaterThan(prixLimit);
// else if recherche is not null
// return productDao.findByNameLike("%"+recherche+"%");
// else
// return some meaningful default behavior such as all
// products,or return 400 to indicate a bad request
}

但是,如果使用路径是此API的必需部分,则有一些选项可以消除歧义:

添加额外的路径元素

@GetMapping(value = "test/produits/prixLimit/{prixLimit}")
public List testeDeRequetes(@PathVariable int prixLimit) {
return productDao.findByPrixGreaterThan(prixLimit);
}
@GetMapping(value = "test/produits/recherche/{recherche}")
public List testeDeRequetes(@PathVariable String recherche) {
return productDao.findByNameLike("%"+recherche+"%");
}

使用单一方法处理这两种情况

@GetMapping(value = "test/produits/{param}")
public List testeDeRequetes(@PathVariable String param) {
// if param is an int...
// return productDao.findByPrixGreaterThan(param);
// else
// return productDao.findByNameLike("%"+param+"%");
}

在路径映射中使用正则表达式

这仍然有一点限制,因为两个正则表达式模式必须互斥,否则您将获得相同的重复映射异常:

// This can only handle digits
@GetMapping(value = "test/produits/{prixLimit:[0-9]+}")
public List testeDeRequetes(@PathVariable int prixLimit) {
return productDao.findByPrixGreaterThan(400);
}
// This can only handle characters
@GetMapping(value = "test/produits/{recherche:[A-Za-z]+}")
public List testeDeRequetes(@PathVariable String recherche) {
return productDao.findByNameLike("%"+recherche+"%");
}

请注意,在这种情况下,您无法搜索“ abc123”。

,

可以使用正则表达式

@GetMapping("/products/{id:[\\d]+}")
public List (@PathVariable Long id){
}
@GetMapping("/products/{name:[a-zA-Z]+}")
public List (@PathVariable String name){
}

推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
author-avatar
akj
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有