spring-boot 请求参数校验:注解 @Validated 的使用、手动校验、自定义校验

这篇具有很好参考价值的文章主要介绍了spring-boot 请求参数校验:注解 @Validated 的使用、手动校验、自定义校验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
spring-boot已经引入了基础包,所以直接使用就可以。

注解 @validated 的使用

@RestController
@Validated
public class LoginController {
    /**
     * 登录接口
     * @return
     */
    @PostMapping("login")
    public String login(@Length(min = 6, max = 12, message = "密码长度必须在6位到12位之间")String pwd) {
        return "ok";
    }
}

注解 @validated 校验参数类

在属性上添加校验注解:

import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;

public class User {

    @NotBlank(message = "用户名不能为null,长度必须大于0")
    String name;   //用户名

    @Min(value = 1, message = "最小年龄为1岁")
    @Max(value = 120, message = "最大年龄为120岁")
    Integer age;  //年龄

    @Email(message = "邮箱格式错误")
    @NotBlank(message = "邮箱必填")
    @Size(min = 6, max = 50, message = "邮箱长度必须在6位到50位之间")
    String email;  //邮箱

    @Length(min = 6, max = 12, message = "密码长度必须在6位到12位之间")
    String pwd;//密码
    
    //...
}

在Controller上添加 @Validated 注解

    /**
     * 登录接口
     * @return
     */
    @PostMapping("login")
    public String login(@Validated @RequestBody User user) {
        return "ok";
    }

校验未通过时,可能看到:

{
  "msg": "邮箱格式错误",
  "code": 500
}

可用的校验注解

JSR提供的校验注解:         
@Null   被注释的元素必须为 null    
@NotNull    被注释的元素必须不为 null,不能为 null , 可以为 ""    
@AssertTrue     被注释的元素必须为 true    
@AssertFalse    被注释的元素必须为 false    
@Min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值    
@Max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值    
@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值    
@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值    
@Size(max=, min=)   验证对象(Array,Collection,Map,String)长度是否在给定的范围之内    
@Digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内    
@Past   被注释的元素必须是一个过去的日期    
@Future     被注释的元素必须是一个将来的日期    
@Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式    

Hibernate Validator提供的校验注解:  
@NotBlank(message =)   只能作用在String上,不能为null,而且调用trim()后,长度必须大于0    
@Email  被注释的元素必须是电子邮箱地址    
@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内    
@NotEmpty   被注释的字符串的必须非空,不能为 null、"",可以为 " "    
@Range(min=,max=,message=)  被注释的元素必须在合适的范围内

手动处理错误

@Validated后面紧跟着追加BindingResult,可接管检验后的处理(处理校验出来的错误):

  /**
     * 登录接口
     *
     * @return
     */
    @PostMapping("login")
    public String login(@Validated @RequestBody User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            //有校验没通过
            List<ObjectError> errorList = bindingResult.getAllErrors();
            for (ObjectError error : errorList) {
                System.out.println(error.getDefaultMessage());  //输出具体的错误信息
            }
            return "参数异常";
        }
        return "ok";
    }

嵌套校验

如果一个类中包含了另外一个实体类,那么在上面加上@Validated即可,比如上面的

 public class User {    
    @validated
    private Dept dept;
 }

@pathvariable的校验

暂不支持

手动校验

    /**
     * 登录接口
     * @return
     */
    @PostMapping("login")
    public String login(@RequestBody User user) {
	    ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
		Validator validator = vf.getValidator();
		Set<ConstraintViolation<User>> set = validator.validate(user);
		for (ConstraintViolation<User> constraintViolation : set) {
		    System.out.println(constraintViolation.getMessage());
		}
        return "ok";
    }

自定义约束注解

自定义约束注解:

/**
 * 自定义手机号约束注解
 */
@Documented
// 注解的作用目标
@Target({ElementType.FIELD})
// 注解的保留策略
@Retention(RetentionPolicy.RUNTIME)
// 不同之处:于约束注解关联的验证器
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {
 
    // 约束注解验证时的输出信息
    String message() default "手机号校验错误";
 
    // 约束注解在验证时所属的组别
    Class<?>[] groups() default {};
 
    // 约束注解的有效负载(严重程度)
    Class<? extends Payload>[] payload() default {};
}

真正的校验者类:

/**
 * 自定义手机号约束注解关联验证器
 */
public class PhoneValidator
        implements ConstraintValidator<Phone, String> {
 
    /**
     * 自定义校验逻辑方法
     * @param value
     * @param context
     * @return
     */
    @Override
    public boolean isValid(String value,
                           ConstraintValidatorContext context) {
 
        // 手机号验证规则:158后头随便
        String check = "158\\d{8}";
        Pattern regex = Pattern.compile(check);
 
        // 空值处理
        String phone = Optional.ofNullable(value).orElse("");
        Matcher matcher = regex.matcher(phone);
 
        return matcher.matches();
    }
}

自定义注解使用:

public class User{
    /**
     * 手机号
     */
    @Phone(message = "手机号不是158后头随便")
    private String phone;
}

手动校验时,自定义注解使用:

Configuration config = Validation.byProvider(PhoneValidator.class).configure();   
ValidatorFactory vf = config.buildValidatorFactory();   
Validator validator = vf.getValidator();  

参考

https://docs.spring.io/spring-framework/docs/5.0.6.RELEASE/spring-framework-reference/core.html#validation-beanvalidation
https://docs.spring.io/spring-framework/docs/5.0.6.RELEASE/spring-framework-reference/web.html#mvc-config-validation
https://docs.spring.io/spring-boot/docs/2.2.13.RELEASE/reference/htmlsingle/#boot-features-validation
https://www.cnblogs.com/zhaoyanjun/p/9007056.html
https://www.cnkirito.moe/spring-validation/
https://www.cnblogs.com/dinghaoran/p/12924518.html
https://www.jianshu.com/p/b3876bf9396c
https://blog.csdn.net/zhu_tianwei/article/details/43272181文章来源地址https://www.toymoban.com/news/detail-415351.html

到了这里,关于spring-boot 请求参数校验:注解 @Validated 的使用、手动校验、自定义校验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot框架中Controller层API接口如何支持使用多个@RequestBody注解接受请求体参数

    众所周知,在Spring Boot框架中,Controller层API接口编码获取请求体参数时,在参数上会使用@RequestBody注解;如果一次请求中,请求体参数携带的内容需要用多个参数接收时,能不能多次使用@RequestBody注解呢? 下面我们先测试一下,参考代码: PostMan进行请求: 服务端后端日志:

    2024年01月17日
    浏览(44)
  • spring-boot 实现接口转发服务,同时支持get 和 post等多种请求

    spring-boot 实现接口转发服务,同时支持get 和 post等多种请求 (1)新建类:ProxyController.java (2)代码说明: 这是一个 Java 类,名称为 ProxyController 。代码中包含以下方法: handleRequest(HttpServletRequest request) 这是一个公共方法,返回类型为 ResponseEntityString ,会抛出一些可能的异

    2024年02月09日
    浏览(34)
  • Spring Boot 中自定义数据校验注解

    在 Spring Boot 中,我们可以使用 JSR-303 数据校验规范来校验表单数据的合法性。JSR-303 提供了一些常用的数据校验注解,例如 @NotNull 、 @NotBlank 、 @Size 等。但是,在实际开发中,我们可能需要自定义数据校验注解来满足特定的需求。本文将介绍如何在 Spring Boot 中自定义数据校

    2024年02月10日
    浏览(48)
  • @Valid、@Validated参数校验详解

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6CfNsNC-1687851467867)(images/20200913110853722.png)] 说明:若不做异常处理,@Validated注解的默认异常消息如下(示例): 因此我们在这里做了一个全局的异常处理类,用于处理参数校验失败后抛出的异常,同

    2024年02月11日
    浏览(28)
  • SpringBoot参数校验@Validated、@Valid

    在实际开发中,前端校验并不安全,任何人都可以通过接口来调用我们的服务,就算加了一层token的校验,有心人总会转空子,来传各式各样错误的参数,如果后端不校验,导致数据库数据混乱、特别是关于金额的数据,可能一个接口把公司都给干倒了 0、返回类(可以不用看

    2024年01月23日
    浏览(33)
  • Spring参数注解,支持数组入参(List)校验

    2、对返回的校验信息异常进行全局捕获,封装后返回。 参考 https://stackoverflow.com/questions/28150405/validation-of-a-list-of-objects-in-spring

    2024年02月11日
    浏览(45)
  • springboot使用@Valid 和 @Validated 注解校验详解以及编写一个自定义全局异常类

    全局异常处理类 验证: ============================================== 导入所需要的包: 如果你是 springboot 项目,那么可以不用引入了,已经引入了,他就存在于最核心的 web 开发包里面。 如果你不是 springboot 项目,那么引入下面依赖即可: 新建三个实体类 实现一: 使用@Valid注解修

    2024年02月10日
    浏览(29)
  • Spring Boot中参数校验

    为了保证数据的正确性、完整性,前后端都需要进行数据检验。作为一名后端开发工程师,不能仅仅依靠前端来校验数据,我们还需要对接口请求的参数进行后端的校验。最常见的做法就是通过if/else语句来对请求的每一个参数一一校验,当很多参数需要校验的时候,if/else语

    2023年04月16日
    浏览(29)
  • Spring Boot 使用validation校验参数

    在看公司代码的时候,发现是用了 Spring Boot Validation 去检验参数的,但是后面又在代码里去检验参数去了,而且这个 Spring Boot Validation 校验好像并不生效。于是自己摸索研究了一下。 虽然项目使用的校验都是 javax.validation ,但是不引入这个依赖他是真的不生效。 gradle如下:

    2024年01月25日
    浏览(36)
  • spring boot3参数校验基本用法

    ⛰️个人主页:      蒾酒 🔥系列专栏: 《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 前置条件 前言 导入依赖 使用介绍 配置检验规则 开启校验 使用注意 全局异常捕获返回友好提示信息 常用的校验规则注解 使用技巧 已经初始化好一个spring boot项目且版本为

    2024年02月21日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包