Spring boot 参数校验

Spring Boot 实现各种参数校验 业务需求总是比框架提供的这些简单校验要复杂的多,我们可以自定义校验来满足我们的需求。自定义约束注解String message() default "加密id格式错误";Class 阅读详情

Spring boot 参数校验

上一节 Spring boot crud 和 swagger使用

Spring boot crud 和 swagger使用

源码

源码地址


springboot web模板已经自动集成了 hibernate-validator; 所以我们引入 spring-boot-starter-web 即可使用;

简介

java 参数校验;是遵循JSR-303 规范,对这种规范实现支持最好的就是 Hibernate Validator; spring 底层也是使用的hibernate validator。简化了 我们在硬编码对参数和bean的校验。

基本数据类型参数校验(包括string,以及基本数据类型的包装类)

请求只接受一个基本类型参数的时候(包括string)不是一个bean;
我们需要在类上加@Validated 然后在方法参数上加上对应的校验注解

我们以String 类型参数为例

使用@Length对string 长度的校验

// 类上加注解 @Validated
@Validated
public class ProductController {

// 参数中使用校JSR303  bean校验注解
@GetMapping("product")
public Product getProduct(@Length(max = 32, min = 32) @RequestParam String id) throws Exception {
...
}
}

通过swagger 调用; 上面我们限制了 id的长度为32, 我们输入一个错误的长度
在这里插入图片描述
我们输入长度为1 的id; 校验生效 提示 长度需要在32到32之间;这是框架自动给我们返回的
当然我们也可以指定message来设置消息;例如:
@Length(max = 32, min = 32, message = “id长度必须为32位”),其他的基本类型使用基本一样;
例如 int , long 值可以使用 @Max @Min 等注解修饰;具体参考常用注解, 不同类型使用不同的校验方式。

实体参数校验

对参数bean进行校验。我们在实体类上使用注解
例如 :
- @NotBlank 不能为null以及空白字符
- @Max 最大值
- @Min 最小值

public class Product {

    @ApiModelProperty(required = true, value = "商品名称")
    @NotBlank
    @Length(min = 1, max = 500)
    private String name;

    @ApiModelProperty(required = true, value = "商品id")
    @NotBlank
    @Length(max = 32, min = 32)
    private String id;

    @ApiModelProperty(required = true, value = "商品价格,以分为单位", dataType = "java.lang.Long", example = "1000")
    @Max(Integer.MAX_VALUE)
    @Min(0)
    private Long price;

上面对实体类Product 进行了name的长度和不能为空白的校验以及id长度限制,price最大值最小值

请求方法添加@Validated 开启校验

  @ApiOperation(value = "添加商品信息", httpMethod = "POST")
    @PostMapping("product")
    public String addProduct(@Validated Product product) throws Exception {
        return product.getId();
    }

使用swagger 调用; 返回400,并且是一组json格式的校验信息很不友好;下个章节对全局异常的处理,设置返回我们自己封装的信息。更加友好简短的返回体

{
  "timestamp": "2021-03-31T08:47:28.158+0000",
  "status": 400,
  "error": "Bad Request",
  "errors": [
    {
      "codes": [
        "Length.product.id",
        "Length.id",
        "Length.java.lang.String",
        "Length"
      ],
      "arguments": [
        {
          "codes": [
            "product.id",
            "id"
          ],
          "arguments": null,
          "defaultMessage": "id",
          "code": "id"
        },
        32,
        32
      ],
      "defaultMessage": "长度需要在32和32之间",
      "objectName": "product",
      "field": "id",
      "rejectedValue": "111",
      "bindingFailure": false,
      "code": "Length"
    }
  ],
  "message": "Validation failed for object='product'. Error count: 1",
  "path": "/validator/product"
}

分组校验

@Validated 是spring 提供的注解,支持分组校验;通过groups 属性进行分组

 例如:
 @Length(min = 32, max = 32, message = "orderId 长度为32", groups = OrderGroup.class)
 通过 属性groups 进行指定是那个组,不指定默认spring提供了javax.validation.groups.Default 分组
  1. 创建自定义分组
    public interface OrderGroup {}
  1. 需要校验得实体bean上进行分组指定 orderGroup
@ApiModel(description = "订单信息描述")
public class OrderEntity {

    @ApiModelProperty(required = true, value = "订单编号")
    @Length(min = 32, max = 32, message = "orderId 长度为32", groups = OrderGroup.class)
    @NotBlank(message = "orderId 必填")
    private String orderId;
...
  1. 请求指定分组校验
   @ApiOperation(value = "添加订单", httpMethod = "POST", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @PostMapping("order")
    public String addOrder(@Validated({Default.class, OrderEntity.OrderGroup.class}) @RequestBody OrderEntity orderEntity) throws Exception {
        return orderEntity.getOrderId();
    }

通过@validated value 可以指定多个分组同时生效,Default.class 为默认分组,若不指定则默认Default.class分组。

示例代码中 属性orderId 同时使用了@Length 和 @NotBlank校验注解; 并且同时指定了分组default 和orderGroup,
所以@Length 和 @NotBlank 都会生效;若不指定分组则默认 @NotBlank 生效;也可以指定多个同时生效。

嵌套校验

使用@Valid 进行实体的嵌套校验。
@Valid 是java自带的校验注解;支持属性嵌套参数校验; 主要是 对实体bean的级联校验;

在实体的属性上添加@Valid

@ApiModel(description = "订单信息描述")
public class OrderEntity {
...
    @ApiModelProperty(required = true, value = "订单详情")
    @NotNull
    @Valid
    private OrderInfo orderInfo;
    ...

OrderInfo 是 OrderEntity 的一个属性; OrderInfo 的属性也添加校验注解,则 对属性 OrderEntity.orderInfo.orderSorce 的校验也生效

   @ApiModel(description = "订单扩展详情")
    public class OrderInfo {

        @ApiModelProperty(value = "订单来源", required = true)
        @Length(max = 32, min = 1)
        @NotBlank
        private String orderSource;

常用校验注解

注解说明备注
@AssertFalse断言为falseJSR303
@AssertTrue断言为trueJSR303
@DecimalMax必须为一个数字,值必须小于或者等于指定的值JSR303
@DecimalMin必须为一个数字,值必须大于或者等于指定的值JSR303
@Digits元素必须是可接受范围内的数字JSR303
@Emailemail格式JSR303
@Future标注在时间类型上,必须是一个未来的时间JSR303
@FutureOrPresent标注在时间类型上,必须是一个未来的时间或者当前JSR303
@Max最大值JSR303
@Min最小值JAR303
@Negative元素必须是严格的负数JSR303
@NegativeOrZero负数或者0JSR303
@NotBlank不能为null和空白JSR303
@NotEmpty不能为null和空字符JSR303
@NotNullnot nullJSR303
@Null必须为nullJSR303
@Past标注在时间类型上,必须为一个过去的时间JSR303
@PastOrPresent标注在时间类型上,为一个过去或者现在的时间JSR303
@Pattern是否匹配正则JSR303
@Positive正数,不包括0JSR303
@PositiveOrZero正数,或者0JSR303
@Size集合大小或者字符串长度限制JSR303
@Length校验字符串长度Hibernate 提供
@Range值得范围Hibernate 提供
@URL合法urlHibernate 提供

自定义校验

通过 @Constraint 指定具体的校验器
示例:

  1. 自定义注解 @FileSufixx 校验文件后缀
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Documented
@Repeatable(value = FileSufixx.List.class)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ValidatedFileSufixx.class)
public @interface FileSufixx {

    String value() default "docx";

    String message() default "上传的文件类型不对,请检查";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @interface List {

        FileSufixx[] value();
    }
}

通过@Constraint(validatedBy = ValidatedFileSufixx.class) 指定校验器
2. 编写校验器
在方法isValid 进行文件后缀名称的判断

public class ValidatedFileSufixx implements ConstraintValidator<FileSufixx, MultipartFile> {

    private String fileSufixx;

    @Override
    public boolean isValid(MultipartFile value, ConstraintValidatorContext context) {
        if (fileSufixx == null || fileSufixx.trim().equals("")) return true;

        String originalFilename = value.getOriginalFilename();
        if (originalFilename.contains(".")) {
            if (originalFilename.substring(originalFilename.lastIndexOf(".") + 1).equals(fileSufixx)) {
                return true;
            }
        }

        return false;
    }

    @Override
    public void initialize(FileSufixx constraintAnnotation) {
        fileSufixx = constraintAnnotation.value();
    }
}
  1. 请求中使用
    上传文件,会走我们自定义的校验器进行文件后缀的校验
    @ApiOperation(value = "上传", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public void upload(@RequestPart("file") @FileSufixx MultipartFile file) {
        System.out.println(file.getOriginalFilename());
    }

下一节 Spring boot 异常配置

Spring boot 异常配置

Spring Boot 实现各种参数校验,建议收藏! 业务需求总是比框架提供的这些简单校验要复杂的多,我们可以自定义校验来满足我们的需求。自定义非常简单,假设我们自定义加密id(由数字或者a-f的字母组成,32-256自定义约束注解String message() default "加密id格式错误";Class 阅读详情

相关推荐

Spring Boot 参数校验 Validation 使用

1. 基于 Bean Validation 标准:Spring Validation 是基于 Bean Validation 标准的参数校验框架,可以实现对 Java Bean 属性和方法参数的校验,提供了一套完整的校验规范和 API,可以很方便地进行扩展和定制。 2. 支持多种校验注解:Spring Validation 支持多种校验注解,比如 @NotNull、@Size、@Min、@Max 等,可以满足不同的校验需求,同时也支持自定义校验注解。 3. 集成方便:Spring Validation 是

ITKidKid的博客 1626

@Length不起作用

@Length不起作用 包导入错误

weixin_46123763的博客 3629

@NotEmpty、@NotBlank等注解的正确使用 @Validated和@Valid的区别 解决@NotBlank等注解不生效的问题 使用BindingResult进行接口请求参数的统一校验

本文带你了解如何正确地使用@NotEmpty、@NotBlank等注解、@Validated和@Valid的区别、解决@NotBlank等注解不生效的问题、使用BindingResult进行(controller)接口请求参数的统一校验。 为什么使用注解呢?因为服务端通常将`controller层`作为调用的第一层,因而参数校验常常在这里完成。假如在controller层的某个方法中,有很多个需要校验的请求参数,这样写无疑会有多条if判断语句,因而,我们需要使用优雅的方式处理接口请求参数。......

念兮为美 8195

SpringMVC数据校验

一、数据校验 数据校验只做前端校验是不安全的,需要在重要的数据的加上后端校验。我们可以写一段程序将每一个数据取出并进行校验,除此之外SpringMVC可以使用JSR303来做数据校验。 JSR303是Java为Bean数据合法性校验提供的标准框架,它可以通过在Bean属性上标注注解来指定校验规则,并通过标准的验证接口对Bean进行验证。 给Employee类的属性添加校验注解 public class Employee { private Integer id; @NotEmpty @Length

qq_39794062的博客 983

Spring Boot Validator校验注解配置说明

Spring Boot Validator校验注解配置说明 验证注解 验证的数据类型 说明 空检查 @Null 任意类型 验证注解的元素值是null @NotNull 任意类型 验证注解的元素不是null @NotBlank CharSequence子类型(CharBuffer、String、StringBuffer、StringBuilder) 验证注解的元素值不为空(不为null、去除首尾空格后长度不为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比

码觉客的博客 1万+

Python+Seaborn可视化:双因素方差分析结果这样呈现更专业

本文详细介绍了如何利用Python中的Seaborn和statsmodels库,专业地执行并可视化双因素方差分析结果。通过模拟实验数据,演示了从模型构建、统计检验(包括交互作用分析)到诊断验证的全流程。重点展示了如何使用Seaborn绘制交互效应图、组合分布图及热图,将复杂的统计结果转化为直观、富有洞察力的可视化图表,助力科研论文与商业报告的专业呈现。

weixin_29274969的博客 136

@NotNull注解放在实体类或者Controller层不生效解决方案

在日常开发过程中,我们会写一些注解⽤于加在java的实体类属性字段上,或者放到controller层的方法参数中,在进⾏请求或请求的时候会根据字段的注解进⾏对应的校验,简化校验相关的代码。 当校验不通过时,会返回对应的message描述 例1:注解写在Controller层的接口参数中 例2:注解写在实体中 当这些注解不生效时,解决方案如下: 1、当@NotNull等注解写在实体类中时,需要在Controller接口的方法参数加入@Valid注解,如下图所示: 2、当@NotNull等注解写在Co.

梦想不会灭 8291

OpenSpec 从入门到精通:AI 时代的最佳 SDD 范式

同样都是「先写规范再写代码」的开源 SDD 框架,OpenSpec(https://github.com/fission-ai/openspec) 展现出了极高的工程性价比,无论是使用 Claude Code、Cursor 还是 Aider,都可以无缝接入 OpenSpec 的规格管理层。这些问题需要人来做判断,AI 做不了这个主。整个流程跑下来,OpenSpec 产出的效果还是令人满意的,一些前期没有考虑到的细节 AI 都补上了,生成的相关文档也有利于开发人员的知识对齐,可以尝试在团队内部推广。

qq_39093474的博客 925

Spring Boot MVC 参数校验

文章目录Spring Boot Validate常用注解使用说明基本使用实现分组校验处理校验结果自定义校验注解配置校验提示信息手动进行校验 Spring Boot Validate Spring Boot 支持JSR303/JSR349验证框架,通过注解实现对参数的校验,并将校验结果封装成BindingResult对象。 常用注解 下面的表格列出常用校验类及主要功能。这些注解必须配合@Valid或...

东京易冷 2239

天龙八部源码深度解析:从宠物系统到副本机制(C++游戏开发实战)

本文深度解析《天龙八部》源码架构,重点剖析宠物系统状态机实现与副本动态加载机制等核心模块。通过C++代码示例展示宠物AI状态迁移逻辑和副本场景管理技术,为现代游戏开发提供兼容性改造方案与设计启示。适合游戏开发者学习经典MMORPG的工程化实现路径。

weixin_29011239的博客 385

无人机航拍图像匹配——SIFT算法实践(含代码)

无人机航拍图像匹配——SIFT算法实践(含代码)

zhangzhao147的博客 6392

Spring Boot 实现各种参数校验,非常实用

Java API规范 (JSR303) 定义了Bean校验的标准validation-api,但没有提供实现。hibernate validation是对这个规范的实现,并增加了校验注解如@Email、@Length等。Spring Validation是对hibernate validation的二次封装,用于支持spring mvc参数自动校验...

Trouvailless的博客 1934

2024年数字IC秋招-速腾聚创-数字芯片验证工程师-笔试题

笔试题型:单选 + 问答题笔试平台:牛客(手机+电脑监控)笔试时间:1hA. len取10的概率是1/2;B. len取10的概率是1/3;C. len取10的概率是1/4;D. len取10的概率是1;

qq_42135020的博客 1396

Spring Boot项目参数校验实战详解

本文介绍了Spring Boot Validation在参数校验中的应用。通过spring-boot-starter-validation可以简化校验流程,提供声明式校验、统一错误处理等功能,帮助开发者构建更健壮的系统。

土豆丝的博客 1398

从代码仓库到知识库:自动化构建与RAG技术实践

在软件工程领域,代码库的规模与复杂性日益增长,如何高效管理和利用其中的知识成为关键挑战。传统文档工具主要依赖注释提取API信息,而现代知识构建技术则通过抽象语法树(AST)解析、自然语言处理等手段,深入理解代码结构、调用关系和业务逻辑。其核心价值在于将非结构化代码转化为机器可理解、可检索的结构化知识,显著提升代码资产的可维护性和团队协作效率。这一过程通常涉及代码解析、信息提取、向量化表示和存储索引四个关键阶段,其中向量化技术将代码语义转化为高维向量,为语义搜索奠定基础。结合检索增强生成(RAG)架构,开发者

weixin_42545292的博客 411

GIS常用符号化色带(超级色带)根据python制作

GIS自带的色带比较单一,今天分享一款色带,应用之后大家出图的时候可以选择更多的配色,符号化/点击色块/样式引用/将样式添加至列表即可。色带类型比较多,大家可以自己尝试下不同的风格。简单符号化一下,看看效果。以中国县级行政区划为例,

J_Giser的博客 2636

Spring Boot中的参数校验

在软件开发中,通常需要对参数进行校验,比如某些参数不能为空,而且不光前端要校验,后端也要校验。那么后端在哪里校验参数?是在控制层还是service层?参数校验有多种实现方式,采用哪一种校验方式呢? 一般来说,把无业务语义的校验放在action层,用validation做校验,比如数据类型,是否为空,数据长度、格式等,有业务语义的校验放在service层。当然实际中往往并没有那么清晰,当校验足够简单时

xiaoyi52的专栏 2922

18、深入解析航空飞行数据中的秘密:从数据清理到高级分析

本文详细解析了如何使用R语言处理和分析航空飞行数据,从基础的数据清理到复杂的回归分析和机器学习模型构建。文章涵盖了探索性数据分析、天气数据的整合、地理信息可视化、时间序列预测以及航班延误的优化策略等内容,展示了如何通过数据挖掘技术提高航空运营效率和乘客满意度,并探讨了数据质量评估与隐私保护的重要性。

convnet3designer的博客 106

Spring Boot 参数校验以及分组校验的使用

一 前言 做web开发有一点很烦人就是要对前端输入参数进行校验,基本上每个接口都要对参数进行校验,比如一些非空校验、格式校验等。如果参数比较少的话还是容易处理的一但参数比较多了的话代码中就会出现大量的if-else语句。 使用这种方式虽然简单直接,但是也有不好的地方,一是降低了开发效率,因为我们需要校验的参数会存在很多地方,并且不同地方会有重复校验,其次降低了代码可读性,因为在业务代码中掺杂了太多额外工作的代码。 所以我们可以使用validator组件来代替我们进行不必要的coding操作。本文基..

数据库技术 509

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring Boot 实现接口的各种参数校验

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。下面有部分截图希望能对大家有所帮助。

2401_85112041的博客 2463

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Spring Boot 自动参数校验

String message() default "手机号格式错误";Class<?Class<?@Overridegraph TDA[添加依赖] --> B[DTO添加校验注解]B --> C[Controller添加@Valid]C --> D[全局异常处理器]D --> E[返回错误信息]通过以上步骤,Spring Boot 会自动完成参数校验,无需手动编写校验逻辑,大幅提升开发效率。

yuren_xia的博客 1216

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Boot参数校验全流程解析

本文系统阐述了异常校验的完整实现逻辑,分为前端校验(提升用户体验)和后端校验(确保系统安全)。以角色名称和岗位添加为例,详细展示了从表单设计、规则触发到异常拦截的全流程。重点介绍了如何自定义参数验证注解@NoSpecialChars,包括注解定义、校验器实现及实体类应用。文中还归纳了常见校验注解(如@NotBlank、@Size)的使用场景,并强调前后端双重校验的必要性——前端快速反馈,后端防范恶意请求。整个校验过程通过全局异常处理器实现统一错误处理,最终形成完整的校验闭环体系。

2301_80194233的博客 1058

Spring-boot如何实现参数校验

基于原始参数校验繁琐的过程,引入了Validator校验框架,简化了参数校验的代码以及流程,方便使用

qq_42796149的博客 2973

Spring boot 参数校验 @Validated、@Valid

2. Controller 参数 + 分组校验:使用 @Validated 3. Service 方法参数校验:只能用 @Validated 四、注意事项与建议 嵌套校验时,必须显式标注 想做 分组校验 / 方法参数校验,就必须用 异常处理可以通过全局异常捕捉器统一处理两者异常@Validated 和 @Valid 在 Controller 层与 Service 层中的校验异常,最终抛出的异常类型是可以统一处理的,只需要在全局定义一个 @ControllerAdvice

qq_44441609的博客 1958

Spring Boot 参数校验 Validation 终极指南

注解使用场景抛出异常@Valid校验对象参数(如 @RequestBody)@Validated校验简单类型参数(如 @RequestParam)@Validated校验对象参数(需配合 @Valid 使用)在大多数项目中,无论是 Bean Validation 定义的约束,还是 Hibernate Validator 附加的约束,都是无法满足我们复杂的业务场景。所以,我们需要自定义约束。1)编写自定义约束的注解;2)编写自定义的校验器 ConstraintValidator。

〆、挽风的博客 2183
上一篇: Spring boot crud 和 swagger使用
下一篇: Spring boot 异常配置
xiaoduup
博客等级 码龄9年 23粉丝 83原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值