如何让Spring Rest 接口中路径参数可选

 更新时间:2021年10月30日 10:56:30   作者:孙亖  
这篇文章主要介绍了如何让Spring Rest 接口中路径参数可选,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实现适用于安卓的文件下载线程类

    java实现适用于安卓的文件下载线程类

    本文给大家分享的是java实现适用于安卓的文件下载线程类的代码,有需要的小伙伴可以参考下
    2015-07-07
  • Java动态调用类中方法代码

    Java动态调用类中方法代码

    这篇文章主要介绍了Java动态调用类中方法代码,需要的朋友可以参考下
    2014-02-02
  • Java利用EasyExcel解析动态表头及导出实现过程

    Java利用EasyExcel解析动态表头及导出实现过程

    以前做导出功能,表头和数据都是固定的,下面这篇文章主要给大家介绍了关于Java利用EasyExcel解析动态表头及导出实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Java调用阿里身份证实现验证接口

    Java调用阿里身份证实现验证接口

    这篇文章主要为大家详细介绍了Java如何调用阿里身份证实现验证接口,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-06-06
  • SpringBoot自定义全局异常处理器的问题总结

    SpringBoot自定义全局异常处理器的问题总结

    Springboot框架提供两个注解帮助我们十分方便实现全局异常处理器以及自定义异常,处理器会优先处理更具体的异常类型,如果没有找到匹配的处理器,那么它会寻找处理更一般异常类型的处理器,本文介绍SpringBoot自定义全局异常处理器的问题,一起看看吧
    2024-01-01
  • Java数据结构超详细分析二叉搜索树

    Java数据结构超详细分析二叉搜索树

    二叉搜索树是以一棵二叉树来组织的。每个节点是一个对象,包含的属性有left,right,p和key,其中,left指向该节点的左孩子,right指向该节点的右孩子,p指向该节点的父节点,key是它的值
    2022-03-03
  • MyBatis使用注解开发实现步骤解析

    MyBatis使用注解开发实现步骤解析

    这篇文章主要介绍了MyBatis使用注解开发实现步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot搭建go-cqhttp机器人的方法实现

    SpringBoot搭建go-cqhttp机器人的方法实现

    本文主要介绍了SpringBoot搭建go-cqhttp机器人的方法实现
    2021-12-12
  • MyBatis传递多个参数方式

    MyBatis传递多个参数方式

    这篇文章主要介绍了MyBatis传递多个参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 详解JAVA生成将图片存入数据库的sql语句实现方法

    详解JAVA生成将图片存入数据库的sql语句实现方法

    这篇文章主要介绍了详解JAVA生成将图片存入数据库的sql语句实现方法的相关资料,这里就是实现java生成图片并存入数据库的实例,需要的朋友可以参考下
    2017-08-08

最新评论