作者:akj | 来源:互联网 | 2023-10-10 10:30
我正在学习有关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)。
prixLimit
和recherche
参数似乎是产品资源上的过滤器/查询,因此将它们作为查询参数而不是路径进行传递更有意义:
@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){
}