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. CAS实现原理

    一.什么是CAS? 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令. 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新 ...

  2. 第二章 dubbo源码解析目录

    6.1 如何在spring中自定义xml标签 dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个 ...

  3. mysql数据库主从同步I/O问题修复

    mysql数据库主从同步I/O问题,下面介绍比较靠谱的修复方法. 主节点IP:10.99.202.25,从节点IP:10.99.202.26,修复步骤如下: 1,查看主库repl账号访问权限 mysq ...

  4. Superset用户集成方案2

    superset 认证分析 superset基于flask-appbuilder开发,security基于flask_appbuilder.security,翻阅其代码, 找到入口: superset ...

  5. .NET Core GC压缩(compact_phase)底层原理浅谈

    简介 终于来到了GC的最后一个步骤,在此之间,大量预备工作已经完成.万事俱备,只欠东风 清除 如果GC决定不压缩,它将仅执行清除操作.清除操作非常简单,把所有不可到达对象(gap),转换成Free.也 ...

  6. 1分钟学会DeepSeek本地部署,小白也能搞定!

    DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型,具备数学推理.代码生成等深度能力,堪称"AI界的六边形战士". DeepSeek 身上的标签有很多,其中最具 ...

  7. postman获取时间戳并自动计算token

    工作中时常要测试接口,公共请求参数包括id, timestamp, token, token = MD5(id + key + timestamp)并转大写. 每次用外部工具去获取时间戳并计算toke ...

  8. 如何训练LLM“思考”(像o1和DeepSeek-R1一样, 高级推理模型解析

    2024年9月,OpenAI发布了它的o1模型,该模型基于大规模强化学习训练,赋予了它"高级推理"能力.不幸的是,他们是如何做到这一点的细节从未被公开披露.然而,今天,DeepSe ...

  9. Ollama模型迁移

    技术背景 在前面的一些文章中,我们介绍过使用Ollama在Linux平台加载DeepSeek蒸馏模型,使用Ollama在Windows平台部署DeepSeek本地模型.除了使用Ollama与模型文件交 ...

  10. [SDOI2016] 数字配对 题解

    发现题目中描述的配对条件可以理解为:\(pc_i-pc_j=1\) 且 \(a_i\bmod a_j=0\),其中 \(pc_i\) 表示 \(a_i\) 的质因数个数. 自然想到以 \(pc\) 奇 ...