[英]Spring: handle ambiguous mapping with BadRequest
我正在开发Spring应用程序,此刻正在对客户注册表进行搜索。
我们的用户请求的关键尖尖的是,搜索可以为下列参数最多之一来进行:名称或 ID(可以是部分的) 或商店ID(其中客户登记店铺) 与多个参数搜索(”如果您愿意,可以组合使用更多过滤器”。
在这里,我遇到了一个问题:我开发了一个带有1个端点的RestController,该端点由3种不同的函数处理,如下所示:
@RestController()
@RequestMapping("v1/customers")
public class ExampleController {
/**
* Search for customer's name (can be partial)
* @param name
* @return
*/
@GetMapping(value="search", params="name")
public String searchByName(String name) {
return "search for name";
}
/**
* Search for the customer by id (can be partial)
* @param name
* @return
*/
@GetMapping(value="search", params="id")
public String searchById(String id) {
return "search for id";
}
/**
* search for the customer from the shop id where he is registered
* @param name
* @return
*/
@GetMapping(value="search", params="shopId")
public String searchByShopID(String shopId) {
return "search for shop";
}
}
一切正常,除了问题:
问题是,如果应用程序接收具有多个查询参数的请求,如下所示:
http://localhost:8080/v1/customers/search?name=bob&shopId=897a
Spring引发“模棱两可的映射”异常,并返回HTTP 500状态代码
我该如何处理? 可以处理返回HTTP 400(和自定义消息)的情况? 可能带有“默认映射”之类的内容。
您可以使用https://docs.spring.io/spring/docs/5.0.8.RELEASE/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#params--参数按HTTP参数进行过滤。 在您的情况下,它将类似于:
@GetMapping(value="search",params = "name")
public String searchByName(@RequestParam("name") String name) {
return "search for name";
}
@GetMapping(value="search",params = "shopId")
public String searchByShopID(@RequestParam("shopId") String shopId) {
return "search for shop";
}
感谢@ GauravRai1512,我又读了一次Spring的文档,我注意到有了“ params”,我也可以过滤掉“ params”参数! (我第一次没有注意到)以这种方式params="!myParam"
所以我尝试用这种方式来做到这一点:
(让我知道您的选择:))
@RestController()
@RequestMapping("v1/customers")
public class ExampleController {
/**
* Search for customer's name (can be partial)
* @param name
* @return
*/
@GetMapping(value="search", params={"name", "!id", "!shopId"})
public String searchByName(String name) {
return "search for name";
}
/**
* Search for the customer by id (can be partial)
* @param name
* @return
*/
@GetMapping(value="search", params={"!name", "id", "!shopId"})
public String searchById(String id) {
return "search for id";
}
/**
* search for the customer from the shop id where he is registered
* @param name
* @return
*/
@GetMapping(value="search", params={"!name", "!id", "shopId"})
public String searchByShopID(String shopId) {
return "search for shop";
}
/**
* Handle invalid reqest
* @param name
* @return
*/
@GetMapping(value="search")
public String searchByShopID() {
return "Invalid!";
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.