Spring根據(jù)URL參數(shù)進(jìn)行路由的方法詳解
前言
本文主要介紹了關(guān)于Spring根據(jù)URL參數(shù)進(jìn)行路由的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí)價(jià)值,下面來一起看看詳細(xì)的介紹吧。
發(fā)現(xiàn)問題
最近在寫接口的時(shí)候發(fā)現(xiàn)一個(gè)問題,就是兩個(gè)REST接口的URL的path部分是一樣的,根據(jù)query傳入不同的參數(shù)來區(qū)分。
比如S3普通上傳接口是是:
PUT /{bucketname}/{ objectname}
分塊上傳的接口是:
PUT /{bucketname}/{objectname}?partNumber={partNumber}&uploadId={uploadId}
傳入partNumber和uploadId是一個(gè)接口,沒有傳入這兩個(gè)參數(shù)是另外一個(gè)接口,那Spring中要如何進(jìn)行路由設(shè)置呢?
一般我們?cè)O(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;
}
這樣會(huì)報(bào)錯(cuò):
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ù)注冊(cè)了,所以@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可以接受簡單類型的屬性,也可以接受對(duì)象類型。
實(shí)質(zhì)是將Request.getParameter() 中的Key-Value參數(shù)Map利用Spring的轉(zhuǎn)化機(jī)制ConversionService配置,轉(zhuǎn)化成參數(shù)接收對(duì)象或字段。
@RequestMapping作為路由注解,除了常用的value字段用于設(shè)置url外,還提供了params參數(shù),可以指定如何匹配url中query的參數(shù)。又幾種配置方法:
- myParam=myValue匹配有myParam參數(shù),并且等于myValue的url
- myParam!=myValue匹配有myParam參數(shù),并且不等于myValue的url
- myParam匹配有myParam參數(shù)的url
- !myParam匹配沒有myParam參數(shù)的url
這樣就可以很靈活的指定路由了。
而且@RequestMapping還提供了headers參數(shù),可以讓我們根據(jù)Header的情況進(jìn)行路由!
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java創(chuàng)建型設(shè)計(jì)模式之單例模式
Java單例模式是一種設(shè)計(jì)模式,它確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問點(diǎn)??梢允褂枚喾N方式實(shí)現(xiàn)單例模式,如餓漢式、懶漢式、雙重檢查鎖定、靜態(tài)內(nèi)部類、枚舉等,每種方式都有其優(yōu)缺點(diǎn),需要根據(jù)具體情況選擇使用2023-05-05
利用Java的Struts框架實(shí)現(xiàn)電子郵件發(fā)送功能
這篇文章主要介紹了利用Java的Struts框架實(shí)現(xiàn)電子郵件發(fā)送功能,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
最長重復(fù)子數(shù)組 findLength示例詳解
今天給大家分享一道比較常問的算法面試題,最長重復(fù)子數(shù)組 findLength,文中給大家分享解題思路,結(jié)合示例代碼介紹的非常詳細(xì),需要的朋友參考下吧2023-08-08
Java實(shí)現(xiàn)http請(qǐng)求文件流對(duì)帶寬限速獲取md5值
文章介紹了如何在進(jìn)行HTTP請(qǐng)求下載大數(shù)據(jù)時(shí)處理帶寬限制和并發(fā)問題,通過使用緩沖區(qū)和限速邏輯,可以有效控制下載速度,避免掉包和數(shù)據(jù)丟失,核心公式基于帶寬和已下載字節(jié)數(shù)計(jì)算預(yù)期耗時(shí),并通過Thread.sleep()進(jìn)行動(dòng)態(tài)休眠補(bǔ)償,感興趣的朋友一起看看吧2025-02-02
SpringMVC項(xiàng)目訪問controller時(shí)候報(bào)404的解決
這篇文章主要介紹了SpringMVC項(xiàng)目訪問controller時(shí)候報(bào)404的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
泛型的類型擦除后fastjson反序列化時(shí)如何還原詳解
這篇文章主要為大家介紹了泛型的類型擦除后fastjson反序列化時(shí)如何還原詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11

