spring boot 校验请求json参数

在后端开发中,通过接口和参数传输来进行与前端交互,才可以让一个项目成型。

由于全后端隔离的方式,所以有时候需要不那么信任前端,也就是在验证当前操作是否有权限同时,校验前端传来的参数的合理性也是必不可少的。

这里只记录post json数据时候的校验方法。


以下代码中使用到的依赖,以及工具类,在结果的git链接中可以找到


  1. 一般的校验方法

    代码:

    // 测试接口
    @RestController
    @RequestMapping("/simple")
    public class SimpleController { // 开发中建议另外定义一个类来接受=收
    // 可以使用内部类, 不过不要写太多
    @Data
    private static class TestParam {
    private int num;
    private String str;
    } @PostMapping("/test")
    public R<?> test(@RequestBody(required = false) TestParam param) { if (StringUtils.isNull(param)
    || StringUtils.isEmpty(param.getStr()) || param.getNum() <= 0) {
    return R.paramErr();
    } // TODO 逻辑处理 return R.ok(new JSONObject());
    }
    }

    测试参数:

    {
    
    }
    or
    {
    "str": 1
    }
    or
    {
    "num": 2
    }

    结果:

    {
    "code": "1001",
    "msg": "参数格式错误",
    "data": null
    }

    结果以及分析:

    • 表述不清楚,不管是缺少,还是不符合格式,全部返回格式错误(单独判断很冗余)。
    • 在str传输数字时候可以通过(给数字类型传纯字符串的处理方法在2.2第第二个处理器
  2. 接下来记录springboot提供的参数校验注解

      <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.5.6</version>
    </dependency>
    1. 参数注解

      @Data
      private static class TestParam {
      @Min(value = 1L, message = "数字参数最小值不能小于1")
      @NotNull(message = "缺少数字参数")
      private int num; @NotNull(message = "缺少字符串参数")
      private String str; @NotNull(message = "对象参数不能为空")
      @Valid
      private TestObjParam obj;
      } @Data
      public static class TestObjParam {
      @NotNull(message = "对象参数内,参数不能为空")
      // 若还有内部对象,继续使用 @Valid 注解即可
      private String param; @NotEmpty(message = "数组不能为空")
      private List<String> stringList; @Size(max = 2, min = 0, message = "性别参数必须在0-2之间")
      private int gender;
      } @PostMapping(value = "/test")
      Object test(@RequestBody @Validated TestParam param) {
      return "通过测试";
      }
    2. 与之配套使用的

      @RestControllerAdvice
      public class ControllerAdvice { /**
      * 拦截JSON参数校验
      */
      @ResponseStatus(HttpStatus.OK)
      @ExceptionHandler(MethodArgumentNotValidException.class)
      public Map<String, String> bindException(MethodArgumentNotValidException e) { BindingResult bindingResult = e.getBindingResult(); String msg = Objects.requireNonNull(
      bindingResult.getFieldError()).getDefaultMessage(); Map<String, String> result = new HashMap<>(); result.put("code", "1001");
      result.put("msg", msg);
      result.put("data", null); return result;
      } /**
      * 拦截类型不匹配。也即需要字段传对象,数字传字符串和对象的情况
      */
      @ResponseStatus(HttpStatus.OK)
      @ExceptionHandler(HttpMessageNotReadableException.class)
      public R<?> bindException(HttpMessageNotReadableException e) { return R.paramErr("参数中有不符合目标格式的");
      }
      }
    3. 结果分析

      • 大大减少了在进行逻辑开发前的手动参数校验
      • 同时前端在对接口时候也可以准确地清楚参数缺少和不符合要求的情况。
  3. 常用的参数,完整版可以在包javax.validation.constraints

    注解 解释 所修饰类型
    @NotNull 被注解的元素不能为null 修饰所有类型参数
    @NotEmpty 不能为空 数组
    @Min(value) 被注解元素的最小值等于value 数字类型
    @Max(value) 被注解的元素的最大值等于value 数字类型
    @Size(max, min) 大小注解 数组
    @Pattern(value) 正则表达式做鉴定
  4. git地址: springboot-param-validate

  5. 补充:

    • @Range校验数字范围
    • @Length校验字符串长度
    • @Size校验String和数组长度
    • @Digits(integer = 6, fraction = 0, message = "") 修饰数字(整数位数和小数位数)
    • @BigDecimalMax和min可配合Digits
  6. 参考资料:


2022-11-17 补充分组



@Validated@Validate的简要区别:

  1. @Validated校验的对象中如果有对象类型的属性, 该属性上需要用@Validate, 可进行校验传递
  2. @Validated可进行分组校验, @Validate无分组校验.

    分组:

import javax.validation.GroupSequence; /**
* 至于interface与@interface在此处的区别, 并未得知
* 参考:
* <a href="https://blog.csdn.net/weixin_45941064/article/details/124192836">Java @interface和interface的区别</a>
* <a href=" https://reflectoring.io/bean-validation-with-spring-boot">Validation with Spring Boot - the Complete Guide</a>
* <a href="https://nullbeans.com/how-to-use-java-bean-validation-in-spring-boot/">How to use Java Bean Validation in Spring Boot</a>
* <a href="https://gitee.com/bootx/bootx-platform">bootx-platform, @cn.bootx.common.core.validation</a>
*
* @author wangXiaoMing
* @date 2022/11/14 17:51
*/
public interface ValidationGroup { /**
* 参数校验分组:添加
*/
@interface create {
} /**
* 参数校验分组:修改
*/
@interface update {
} /**
* 参数校验分组:添加修改 - 也可使用序列
*/
@interface createUpdate {
} /**
* 参数校验分组:删除
*/
@interface delete {
} /**
* 参数校验分组:查询
*/
@interface query {
} /**
* 先校验update, 再校验delete, 然后时create
* 代表校验顺序, 和需要校验的分组
* <p>
* 参考:
* <a href="https://blog.csdn.net/qq_17586821/article/details/104661914">validation-api中@GroupSequence的使用</a>
* <a href="https://blog.csdn.net/chepeng3577/article/details/100719210">@GroupSequence自定义验证顺序</a>
* <a href="https://blog.csdn.net/linxingliang/article/details/122044749">validation数据校验之分组校验怎么玩?</a>
*/
@GroupSequence({update.class, delete.class, create.class})
@interface order {
} }

使用:

多个分组时需要使用{}, 单个时可省略

@NotNull(message = "id不能为空1", groups = {ValidationGroup.create.class})

Controller中使用时@Validated({ValidationGroup.create.class})进行校验

分组序列@GroupSequence的使用:

  1. 指定包含的分组(其他分组不会校验, 如上面的querycreateUpdate)
  2. 以及校验的对应的顺序

SpringBoot校验请求Json参数的更多相关文章

  1. 逐层解析请求json参数字符串【我】

    import net.sf.json.JSONObject; 逐层解析请求json参数字符串: InputStream inStream =null; BufferedReader br =null; ...

  2. SpringBoot获取请求的参数

    说明 SpringBoot 为我们封装了许多,简便的获取请求参数的方法! 1.获取无注解获取请求参数 请求地址:http://192.168.0.115:8080/myproject/test/noA ...

  3. SpringBoot:自定义注解实现后台接收Json参数

    0.需求 在实际的开发过程中,服务间调用一般使用Json传参的模式,SpringBoot项目无法使用@RequestParam接收Json传参 只有@RequestBody支持Json,但是每次为了一 ...

  4. SpringBoot配置Swagger实例(POST接收json参数)

    工程目录结构: 首先,引入jar包,只需要以下两个即可 <dependency> <groupId>io.springfox</groupId> <artif ...

  5. play framework接收post请求json格式的参数

    大家在用play framework框架开发第三方调用你的接口的时候并且用json格式的参数post请求 ,参数接收是个问题 ,因为play对表单提交post请求有处理: 有两种方法: 1.直接形参列 ...

  6. C# ContentType: "application/json" 请求方式传json参数问题

    处理Http请求时遇到的ContentType为application/json方式,记录下这种Post请求方式下如何传json参数: var request = (HttpWebRequest)We ...

  7. ②HttpURLConnection通过Json参数方式提交Post请求

    之前的文章介绍过通过报文的方式HttpURLConnection提交post请求,今天介绍下通过Json参数的方法提交Post请求,先上代码 public static HttpResponse se ...

  8. ReadyAPI/soapUI发送post请求json格式(带有中文字符),后台获取参数为空

    解决:请求编码格式默认为空,在"TestCase"的指定Step的Request Properties中, 改Encoding编码格式为UTF-8. 原文:soapUI发送post ...

  9. curl 使用 post 请求,传递 json 参数,下载文件

    curl -X POST http://ip:8888/nacos/v1/cs/file/download -H "Accept: application/octet-stream" ...

  10. 1. 处理静态资源 2. controller如何接受请求得参数 3. 如何把controller得数据保存到view. 4. 在controller如何完成重定向到指定路径 5. controller返回json数据

    1. 1. 处理静态资源2. controller如何接受请求得参数3. 如何把controller得数据保存到view.4. 在controller如何完成重定向到指定路径5. controller ...

随机推荐

  1. 第一个shell脚本(bash脚本)

    首先它是一个脚本,并不能作为正式的编程语言.因为是跑在linux的shell中,所以叫shell脚本.说白了,shell脚本就是一些命令的集合.运维工作中把常用的一系列的操作都记录到一个文档中,然后去 ...

  2. 基于C#实现多线程启动停止暂停继续

    大家好!我是付工. 大部分初学者在学习C#上位机编程时,多线程是一个很难逾越的鸿沟,不合理地使用多线程,会导致经常出现各种奇怪的问题,这也是很多初学者不敢使用多线程的原因.但是在实际开发中,多线程是一 ...

  3. Docker核心技术及架构

  4. Windows中利用任务计划执行进程守护

    在Windows中除了开发专用的进程守护外,还可以利用任务计划做进程守护. 一.bat示例 tasklist | findstr "notepad" if %ERRORLEVEL% ...

  5. 00.嵌入式笔记——初识make工具和Makefile文件

    1. make工具和Makefile文件 make是解决大工程编译的工具,描述哪些文件需要编译.哪些需要重新编译的文件就叫做 Makefile,Makefile 就跟脚本文件一样,Makefile 里 ...

  6. JS深度理解

    事件循环 程序运行需要有自己专属的内存空间,可以把这块内存简单理解为进程 每个应用至少有一个进程,进程间相互独立,要通信,也需要双方同意 线程 有进程后,就可以运行程序的代码 运行代码的 [人] 称为 ...

  7. (vm/vb)虚拟机复制或者拷贝之后连不上网络怎么处理?

    (vm/vb)虚拟机复制或者拷贝之后连不上网络怎么处理? Linux虚拟机无论在VMware还是VirtualBox下面,只要复制拷贝到别的地方,开启网络服务都会出现报错的问题. 这里以CentOS ...

  8. 天翼云VPC支持专线健康检查介绍

    本文分享自天翼云开发者社区<天翼云VPC支持专线健康检查介绍>,作者:汪****波 天翼云支持本地数据中心IDC(Internet Data Center)通过冗余专线连接到天翼云云上专有 ...

  9. linux mint安装Idea

    一.前言 这一节我们介绍在Linux下如何安装与破解Intellij idea2017.现在有很多公司开发环境都是Linux,所以掌握在Linux环境下使用Idea办公也是咱们必须得掌握的技能. 记住 ...

  10. 在flink消费一段时间kafka后,kafka-group的offset被重置了是怎么回事?

    一.背景 腾讯Flink使用 KafkaSource API创建source端,源码中默认开启了checkpoint的时候提交offset 到kafka-broker.读取kafka数据写入到iceb ...