我正在开发Spring应用程序,此刻正在对客户注册表进行搜索。
我们用户要求的一个关键点是,最多可以对一个以下参数进行搜索:名称 OR id(可以是部分)< strong> OR 商店ID(注册客户的商店) 不允许同时搜索更多参数(如果需要,可以使用“更多过滤器”)。
在这里我遇到了一个问题:我开发了一个RestController,它具有由3个不同的函数处理的1个端点:
@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(和自定义消息)的情况?也许带有“默认映射”之类的内容。
答案 0 :(得分:1)
您可以使用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";
}
答案 1 :(得分:0)
感谢@ 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!";
}
}