Spring:使用BadRequest处理不明确的映射



我正在开发一个Spring应用程序,目前我正在我们的客户注册中心上实现搜索。

我们的用户请求的一个关键点是,最多可以搜索以下参数中的ONE:nameORid(可以是部分(ORshop id(客户注册的商店(不允许同时使用更多参数(如果您愿意,可以使用"更多过滤器"(进行搜索

在这里我遇到了问题:我开发了一个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抛出一个"模糊映射"异常,并返回一个HTTP500状态代码

我该怎么处理?是否可以处理返回HTTP400(和自定义消息(的情况?也许可以使用"默认映射"之类的东西。

您可以使用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="!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!";
}
} 

最新更新