春季:使用BadRequest

时间:2018-11-19 15:35:12

标签: java spring rest

我正在开发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(和自定义消息)的情况?也许带有“默认映射”之类的内容。

2 个答案:

答案 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!";
    }

}