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. MySQL---索引-性能-配置参数优化

    一般来说,要保证数据库的效率,要做好以下四个方面的工作:数 据库设计.sql语句优化.数据库参数配置.恰当的硬件资源和操作系统,这个顺序也表现了这四个工作对性能影响的大小.下面我们逐个阐明: 1.设计 ...

  2. Graph DataBase介绍-图数据库

    前言分析社会关系这类复杂图壮结构的海量数据,使用图形数据库(Graph DataBase)是最好的选择.– 作者:李祎 <程序员>介绍各种NoSQL 数据库的文章已经很多,不过大部分都是基 ...

  3. C# Caching---Cache 缓存

    1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 usin ...

  4. 2024年春秋杯网络安全联赛冬季赛部分wp

    部分附件下载地址: https://pan.baidu.com/s/1Q6FjD5K-XLI-EuRLhxLq1Q 提取码: jay1 Misc day1-简单算术 根据提示应该是异或 下载文件是一个 ...

  5. Idea下载插件报错

    报错内容Plugin Python was not installed: Cannot download 'https://plugins.jetbrains. 解决办法 file ->  se ...

  6. 什么是Lambda架构?

    一.简介 Lambda架构(Lambda Architecture)是由Twitter工程师南森·马茨(Nathan Marz)提出的大数据处理架构. 这一架构的提出基于马茨在BackType和Twi ...

  7. AI如何改变数据驱动决策的方式

    导语 在这个信息爆炸的时代,数据成为了企业和组织最为宝贵的资源.然而,单纯的数据堆积并没有太大价值,只有通过分析和挖掘,才能真正发挥数据的潜力.随着AI技术的飞速发展,我们正见证着数据驱动决策方式发生 ...

  8. idea debug时提示”Method breakpoints may dramatically slow down debugging“的解决办法

  9. QT5笔记:2.可视化UI设计

    2.可视化UI设计 参考视频:https://www.bilibili.com/video/BV1AX4y1w7Nt 窗口的三种类型,每种类型窗体拥有的方法不同: MainWindow:指的是正常窗体 ...

  10. MD5 - windows也可以查询某个文件的MD5码

    命令格式 certutil -hashfile 文件名称 md5 示例 Microsoft Windows [版本 10.0.22621.1702] (c) Microsoft Corporation ...