[英]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.