前言
本文主要介紹了關于Spring根據URL參數進行路由的相關內容,分享出來供大家參考學習價值,下面來一起看看詳細的介紹吧。
發現問題
最近在寫接口的時候發現一個問題,就是兩個REST接口的URL的path部分是一樣的,根據query傳入不同的參數來區分。
比如S3普通上傳接口是是:
1
|
PUT /{bucketname}/{ objectname} |
分塊上傳的接口是:
1
|
PUT /{bucketname}/{objectname}?partNumber={partNumber}&uploadId={uploadId} |
傳入partNumber和uploadId是一個接口,沒有傳入這兩個參數是另外一個接口,那Spring中要如何進行路由設置呢?
一般我們設置路由都是@RequestMapping(value = "/xx", method = RequestMethod.GET)
。然后在方法簽名中可以通過@RequestParam注入參數。
但是直接通過注入不同的參數來實現區分是不行的,比如:
1
2
3
4
5
6
7
8
9
10
|
@ResponseBody @RequestMapping (value = "/xx" , method = RequestMethod.GET) public String get1(){ return "get1" ; } @ResponseBody @RequestMapping (value = "/xx" , method = RequestMethod.GET) public String get2( @RequestParam name){ return "get2" + name; } |
這樣會報錯:
1
2
3
|
java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'DemoController_v01' method public java.lang.String com.nd.sdp.ndss.controller.v01.DemoController.get1() to {[/demo/xx],methods=[GET]}: There is already 'DemoController_v01' bean method |
解決方法
意思是重復注冊了,所以@RequestParam是不能用來作為路由依據的。
@RequestParam
用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容。(Http協議中,如果不指定Content-Type,則默認傳遞的參數就是application/x-www-form-urlencoded類型)
RequestParam可以接受簡單類型的屬性,也可以接受對象類型。
實質是將Request.getParameter() 中的Key-Value參數Map利用Spring的轉化機制ConversionService配置,轉化成參數接收對象或字段。
@RequestMapping作為路由注解,除了常用的value字段用于設置url外,還提供了params參數,可以指定如何匹配url中query的參數。又幾種配置方法:
- myParam=myValue匹配有myParam參數,并且等于myValue的url
- myParam!=myValue匹配有myParam參數,并且不等于myValue的url
- myParam匹配有myParam參數的url
- !myParam匹配沒有myParam參數的url
這樣就可以很靈活的指定路由了。
而且@RequestMapping還提供了headers參數,可以讓我們根據Header的情況進行路由!
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://mushanshitiancai.github.io/2017/11/30/java/spring/Spring筆記-根據URL參數進行路由