簡體   English   中英

Spring:使用BadRequest處理模棱兩可的映射

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM