前言
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:空間域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、蒼南網(wǎng)站維護(hù)、網(wǎng)站推廣。
本文主要介紹了關(guān)于Spring根據(jù)URL參數(shù)進(jìn)行路由的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí)價值,下面來一起看看詳細(xì)的介紹吧。
發(fā)現(xiàn)問題
最近在寫接口的時候發(fā)現(xiàn)一個問題,就是兩個REST接口的URL的path部分是一樣的,根據(jù)query傳入不同的參數(shù)來區(qū)分。
比如S3普通上傳接口是是:
PUT /{bucketname}/{ objectname}
分塊上傳的接口是:
PUT /{bucketname}/{objectname}?partNumber={partNumber}&uploadId={uploadId}
傳入partNumber和uploadId是一個接口,沒有傳入這兩個參數(shù)是另外一個接口,那Spring中要如何進(jìn)行路由設(shè)置呢?
一般我們設(shè)置路由都是@RequestMapping(value = "/xx", method = RequestMethod.GET)
。然后在方法簽名中可以通過@RequestParam注入?yún)?shù)。
但是直接通過注入不同的參數(shù)來實(shí)現(xiàn)區(qū)分是不行的,比如:
@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; }
這樣會報錯:
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
解決方法
意思是重復(fù)注冊了,所以@RequestParam是不能用來作為路由依據(jù)的。
@RequestParam
用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內(nèi)容。(Http協(xié)議中,如果不指定Content-Type,則默認(rèn)傳遞的參數(shù)就是application/x-www-form-urlencoded類型)
RequestParam可以接受簡單類型的屬性,也可以接受對象類型。
實(shí)質(zhì)是將Request.getParameter() 中的Key-Value參數(shù)Map利用Spring的轉(zhuǎn)化機(jī)制ConversionService配置,轉(zhuǎn)化成參數(shù)接收對象或字段。
@RequestMapping作為路由注解,除了常用的value字段用于設(shè)置url外,還提供了params參數(shù),可以指定如何匹配url中query的參數(shù)。又幾種配置方法:
這樣就可以很靈活的指定路由了。
而且@RequestMapping還提供了headers參數(shù),可以讓我們根據(jù)Header的情況進(jìn)行路由!
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。