如何讓Spring Rest 接口中路徑參數(shù)可選
Spring Rest接口路徑參數(shù)可選
我有一個(gè) Spring Rest 服務(wù),其中有一個(gè)路徑參數(shù)是可選的(實(shí)際情況是我原來(lái)將參數(shù)放到路徑中,而另外一個(gè)前端通過(guò) body 傳給我)。按照傳統(tǒng)的方式是把這個(gè)服務(wù)在代碼里面分成兩個(gè)方法,一個(gè)帶路徑參數(shù),一個(gè)不帶,但是這樣看起來(lái)不優(yōu)雅,讓人疑惑。
我試著給 @PathVariable 注解加上 require=false 注解,但是不起作用,返回404錯(cuò)誤。
下面的形式就是傳統(tǒng)方式:
@RequestMapping(value = "/path/{id}") public String getResource(@PathVariable String id) { return service.processResource(id); } @RequestMapping(value = "/path") public String getResource() { return service.processResource(); }
但是我真的不喜歡這種方式,臃腫。
從 Spring 4 and Java 8 開(kāi)始(其實(shí)和 Java 8 關(guān)系不大),在一個(gè)方法里面實(shí)現(xiàn)可選路徑參數(shù)變得很簡(jiǎn)單,如下所示,就是同時(shí)定義兩個(gè)路由:
@RequestMapping(value = {"/path", "/path/{id}") public String getResource(@PathVariable Optional<String> id) { if (id.isPresent()) { return service.processResource(id.get()); } else { return service.processResource(); } }
確實(shí),在一個(gè)方法里面統(tǒng)一業(yè)務(wù)要優(yōu)雅得多。
RestFul風(fēng)格傳參
RestFul風(fēng)格就是所有參數(shù)都由/傳遞,而不是傳統(tǒng)的?xx&xx形式
例如:寫一個(gè)Controller:
package controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class RestfulController { @RequestMapping("/add") public String test(int a,int b, Model model){ int res = a+b; model.addAttribute("msg","結(jié)果為"+res); return "test"; } }
可以看到出現(xiàn)a,b沒(méi)找到的錯(cuò)誤
按照傳統(tǒng)方式傳遞參數(shù):?a=1&b=2
那么按照Restful風(fēng)格傳遞參數(shù)就應(yīng)該:在方法參數(shù)值前加@PathVariable注解,并在url上直接綁定參數(shù),可以同時(shí)設(shè)置Request的方法類型(GET、POST、DELETE、OPTIONS、HEAD、PATCH、PUT、TRACE)
@PathVariable:讓方法參數(shù)的值對(duì)應(yīng)綁定到一個(gè)url模板變量上
package controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class RestfulController { @RequestMapping(value = "/add/{a}/",method = RequestMethod.GET) public String test(@PathVariable int a,@PathVariable int b, Model model){ int res = a+b; model.addAttribute("msg","結(jié)果為"+res); return "test"; } }
再次開(kāi)啟Tomcat,并設(shè)定a=1,b=3:
/add/1/3傳遞參數(shù)
這就是restful風(fēng)格傳參
也可以通過(guò)變相的組合注解實(shí)現(xiàn):
@PostMapping
@GetMapping
@PutMapping
@DeleteMapping
@PatchMapping
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)適用于安卓的文件下載線程類
本文給大家分享的是java實(shí)現(xiàn)適用于安卓的文件下載線程類的代碼,有需要的小伙伴可以參考下2015-07-07Java動(dòng)態(tài)調(diào)用類中方法代碼
這篇文章主要介紹了Java動(dòng)態(tài)調(diào)用類中方法代碼,需要的朋友可以參考下2014-02-02Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過(guò)程
以前做導(dǎo)出功能,表頭和數(shù)據(jù)都是固定的,下面這篇文章主要給大家介紹了關(guān)于Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12Java調(diào)用阿里身份證實(shí)現(xiàn)驗(yàn)證接口
這篇文章主要為大家詳細(xì)介紹了Java如何調(diào)用阿里身份證實(shí)現(xiàn)驗(yàn)證接口,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-06-06SpringBoot自定義全局異常處理器的問(wèn)題總結(jié)
Springboot框架提供兩個(gè)注解幫助我們十分方便實(shí)現(xiàn)全局異常處理器以及自定義異常,處理器會(huì)優(yōu)先處理更具體的異常類型,如果沒(méi)有找到匹配的處理器,那么它會(huì)尋找處理更一般異常類型的處理器,本文介紹SpringBoot自定義全局異常處理器的問(wèn)題,一起看看吧2024-01-01Java數(shù)據(jù)結(jié)構(gòu)超詳細(xì)分析二叉搜索樹
二叉搜索樹是以一棵二叉樹來(lái)組織的。每個(gè)節(jié)點(diǎn)是一個(gè)對(duì)象,包含的屬性有l(wèi)eft,right,p和key,其中,left指向該節(jié)點(diǎn)的左孩子,right指向該節(jié)點(diǎn)的右孩子,p指向該節(jié)點(diǎn)的父節(jié)點(diǎn),key是它的值2022-03-03MyBatis使用注解開(kāi)發(fā)實(shí)現(xiàn)步驟解析
這篇文章主要介紹了MyBatis使用注解開(kāi)發(fā)實(shí)現(xiàn)步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot搭建go-cqhttp機(jī)器人的方法實(shí)現(xiàn)
本文主要介紹了SpringBoot搭建go-cqhttp機(jī)器人的方法實(shí)現(xiàn)2021-12-12詳解JAVA生成將圖片存入數(shù)據(jù)庫(kù)的sql語(yǔ)句實(shí)現(xiàn)方法
這篇文章主要介紹了詳解JAVA生成將圖片存入數(shù)據(jù)庫(kù)的sql語(yǔ)句實(shí)現(xiàn)方法的相關(guān)資料,這里就是實(shí)現(xiàn)java生成圖片并存入數(shù)據(jù)庫(kù)的實(shí)例,需要的朋友可以參考下2017-08-08