热门标签 | 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){
}

推荐阅读
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社区 版权所有