如何让Spring Rest 接口中路径参数可选
作者:孙亖 发布时间:2022-02-17 19:29:14
Spring Rest接口路径参数可选
我有一个 Spring Rest 服务,其中有一个路径参数是可选的(实际情况是我原来将参数放到路径中,而另外一个前端通过 body 传给我)。按照传统的方式是把这个服务在代码里面分成两个方法,一个带路径参数,一个不带,但是这样看起来不优雅,让人疑惑。
我试着给 @PathVariable 注解加上 require=false 注解,但是不起作用,返回404错误。
下面的形式就是传统方式:
@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 开始(其实和 Java 8 关系不大),在一个方法里面实现可选路径参数变得很简单,如下所示,就是同时定义两个路由:
@RequestMapping(value = {"/path", "/path/{id}")
public String getResource(@PathVariable Optional<String> id) {
if (id.isPresent()) {
return service.processResource(id.get());
} else {
return service.processResource();
}
}
确实,在一个方法里面统一业务要优雅得多。
RestFul风格传参
RestFul风格就是所有参数都由/传递,而不是传统的?xx&xx形式
例如:写一个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","结果为"+res);
return "test";
}
}
可以看到出现a,b没找到的错误
按照传统方式传递参数:?a=1&b=2
那么按照Restful风格传递参数就应该:在方法参数值前加@PathVariable注解,并在url上直接绑定参数,可以同时设置Request的方法类型(GET、POST、DELETE、OPTIONS、HEAD、PATCH、PUT、TRACE)
@PathVariable:让方法参数的值对应绑定到一个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}/{b}",method = RequestMethod.GET)
public String test(@PathVariable int a,@PathVariable int b, Model model){
int res = a+b;
model.addAttribute("msg","结果为"+res);
return "test";
}
}
再次开启Tomcat,并设定a=1,b=3:
/add/1/3传递参数
这就是restful风格传参
也可以通过变相的组合注解实现:
@PostMapping
@GetMapping
@PutMapping
@DeleteMapping
@PatchMapping
来源:https://sunsi.blog.csdn.net/article/details/102519682


猜你喜欢
- 本文实例讲述了Java判断两个日期相差天数的方法。分享给大家供大家参考。具体如下:import java.util.Calendar;pub
- 一、概述数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等,可动态地改变透视表版面布置,也可以重新安排行
- 本文实例为大家分享了android Matrix图片随意放大缩小和拖动的具体代码,供大家参考,具体内容如下step1:新建一个项目DragA
- 编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯。1、 项目名全部小写2、 包名全部小写3、 类名首字母大写,
- 本文实例讲述了Java线程同步方法。分享给大家供大家参考,具体如下:1. Semaphore1.1 二进制SemaphoreSemaphor
- 前言: Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版。在Java Code Geeks上已经有很多介绍
- IEnumerable、ICollection、IList、List之间的区别,本文分别分析了它的实现源码,从而总结出了它们之间的关系和不同
- 本篇文章所涉及到的demo练习 使用的cloud 2021.0.3+ springboot2.6.8一、概述简介官网:https://doc
- spring boot2集成activiti6踩过的坑1.activiti中的mybaitis版本冲突 错误信息Caused by: jav
- 本文实例讲述了C#编程实现统计文件夹内文件和隐藏文件的方法。分享给大家供大家参考,具体如下:C#统计文件夹内的文件,包括隐藏文件,显示那个隐
- 前言在Android中经常要使用Dialog来实现一些提示以及一些特殊的效果,而且样式也不一样,每次都得查一大堆资料,还不一定能解决。对话框
- 本文实例为大家分享了Java实现FTP上传与下载的具体代码,供大家参考,具体内容如下JAVA操作FTP服务器,只需要创建一个FTPClien
- 概述LinearLayout是线性布局组件,放置在其中的组件按列或者按行(就是垂直或者水平)的方式排序分布。常用XML配置属性(1)&nbs
- bufferedReader.readLine()读到最后发生阻塞最近在做一个imageserver,需求简化后就是使用socket响应HT
- 上一篇写了一下装箱拆箱的定义和IL分析,这一篇我们看下使用泛型和不使用泛型引发装箱拆箱的情况1.使用非泛型集合时引发的装箱和拆箱操作 看下面
- 原理简介 & OpenGL 的优势裸眼 3D 效果的本质是——将整个图片结构分为 3 层:上
- 一、问题描述如果在 SpringBoot 项目中的 application.properties 配置了某个属性(假如属性名为 test.k
- mybatis in查询条件过长的解决方法1:分次查询,将参数且分割成多个短的查询后合并代码: in
- 前言众所周知在spring boot内,设置session过期时间只需在application.properties内添加server.se
- Android 校验email是否合法这个其实跟JAVA中是一样的。例子: String regEx = "^(([