SpringBoot参数校验之@Validated的使用详解

yizhihongxing

下面就为大家详细讲解“SpringBoot参数校验之@Validated的使用详解”。

什么是@Validated

在Spring框架中,我们经常需要对方法入参的校验,以保证参数的正确性。 SpringBoot基于Hibernate Validator,为开发者提供了方便简洁的实现方式:@Validated。

@Validated 用于校验方法入参,可以将该注解放置在类或方法上。放在类上,将对该类所有方法生效。

@Validated 支持的校验注解

@Validated 除了支持 Hibernate Validator 中的约束注解外,还支持 Spring 自己定义的注解,其中包括:

  • @NotBlank, @NotNull, @NotEmpty
  • @Email, @Range, @Length
  • 自定义注解(通过 @ConstraintValidator 实现自定义注解)

@Validated 的使用

使用 @Validated 需要先引入 Hibernate Validator 的依赖:

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.2.0.Final</version>
</dependency>

具体使用示例如下。

方法参数校验

在 Controller 中需要校验的方法入参前加上 @Validated 注解即可。

@RestController
@Validated
public class UserController {

    @PostMapping("/user")
    public String addUser(@RequestBody @Validated User user) {
        userService.addUser(user);
        return "添加用户成功";
    }

}

自定义校验注解

自定义注解需要实现一个 ConstraintValidator 接口,并在使用时通过该注解指定校验器。

下面给出一个自定义的注解 @Phone:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {

    String message() default "电话号码格式不正确";

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

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

}

PhoneValidator 的实现:

public class PhoneValidator implements ConstraintValidator<Phone, String> {

    private static final String PHONE_REGEX = "^1([38]\\d|5[0-35-9]|7[3678])\\d{8}$";
    private boolean required;

    @Override
    public void initialize(Phone constraintAnnotation) {
        required = constraintAnnotation.required();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (required && StringUtils.isBlank(value)) {
            return false;
        } else {
            return Pattern.matches(PHONE_REGEX, value);
        }
    }
}

在需要校验的属性上加上 @Phone 注解即可:

public class User {

    @Phone
    private String phone;

    // setter and getter
}

示例

下面提供两个示例,以便更好地理解 @Validated 校验方法参数的过程。

示例一

有一个简单的用户注册接口需要对请求参数进行校验,要求 username 不为空且长度要在 5-20 之间,而 password 必须更长一些,至少 8 个字符。

@RestController
@Validated
public class UserController {

    @PostMapping("/register")
    public String register(@RequestParam @NotBlank @Length(min = 5, max = 20) String username,
                           @RequestParam @NotBlank @Length(min = 8) String password) {
        return "用户名:" + username + ",密码:" + password;
    }

}

其中带有 @NotBlank 和 @Length 注解的参数均需要通过校验,否则将会返回错误信息。

示例二

通过自定义注解 @Phone 实现对手机号参数进行校验。

@RestController
@Validated
public class UserController {

    @PostMapping("/user")
    public String addUser(@RequestBody @Validated User user) {
        userService.addUser(user);
        return "添加用户成功";
    }

}

public class User {

    private String username;

    @Phone
    private String phone;

    // setter and getter
}

在 User 对象中的属性 phone 上使用了 @Phone 自定义注解,用于校验手机号格式。如果格式不正确,将会抛出错误信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot参数校验之@Validated的使用详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java中字符串参数化符号${}的解析

    在Java中,字符串参数化符号${}是用于字符串模板中的占位符,可以在占位符中插入变量名,并在运行时将其动态替换为相应的值。 下面是解析${}的基本过程: 识别占位符 在字符串中找到${的位置,表示占位符开始。 识别变量名 在占位符中寻找变量名,变量名可以是任意的合法Java标识符。 识别默认值 如果占位符中包含默认值,使用冒号 : 来和变量名分隔。默认值是…

    Java 2023年5月26日
    00
  • 关于Struts2的类型转换详解

    关于Struts2的类型转换详解 什么是类型转换 在Struts2中,类型转换是将HTTP请求中的字符串类型的参数转换为Java对象的过程。例如,将”1″转换为整数类型的1,将”2021-01-01″转换为日期类型的2021/01/01。类型转换是Struts2框架中非常重要的一部分,可以帮助开发者轻松地获取HTTP请求中的参数并将其转换为Java对象。St…

    Java 2023年5月20日
    00
  • Java基于对象流实现银行系统

    Java基于对象流实现银行系统攻略 1. 理解对象流 对象流是一种可以直接将Java对象写入或读取出来的数据流 对象流可以用于Java对象的序列化和反序列化 2. 设计银行系统类 设计客户类和账户类,客户类包含姓名,身份证号码等基本信息,账户类包含账户号码,账户余额等信息 账户类继承自客户类,可以使用客户类的信息 设计用户登录系统,可以根据账户号码和密码登录…

    Java 2023年5月24日
    00
  • Spring Boot编写拦截器教程实例解析

    下面是“Spring Boot编写拦截器教程实例解析”的完整攻略。 1. 什么是拦截器? 在 Spring Boot 中,拦截器(Interceptor)是一种 AOP(面向切面编程)技术,它可以在请求到达目标方法之前,或者在请求结束之后,实现相应的拦截操作。拦截器可以用来记录日志、验证用户权限、对请求参数进行处理等。 2. Spring Boot 中实现拦…

    Java 2023年5月31日
    00
  • AndroidApk混淆编译时,报告java.io.IOException…错误解决办法

    当进行Android APK混淆编译时,可能会遇到java.io.IOException错误,这通常是由于ProGuard或其他混淆工具未能正确读取输入文件而导致的。以下是解决这个问题的一些方法。 检查混淆配置文件 请确认你的混淆配置文件中是否列出了正确的输入、输出文件路径。查看混淆配置文件,确定输入、输出文件路径是否正确。 示例: -injars <…

    Java 2023年5月26日
    00
  • Java 数组元素倒序的三种方式(小结)

    下面是我对“Java 数组元素倒序的三种方式(小结)”这篇文章的详细讲解。 前言 文章初步介绍了Java中实现数组元素倒序的三种方式,包含了反转、迭代以及集合的实现方式。接下来,我将详细地讲解这三种方式的实现过程和示例。 反转数组 反转数组是实现数组元素倒序最基本的方法,这种方式直接利用了Java提供的Arrays工具类中的reverse()方法来实现。下面…

    Java 2023年5月26日
    00
  • 浅谈java中定义泛型类和定义泛型方法的写法

    下面是“浅谈Java中定义泛型类和定义泛型方法的写法”的完整攻略。 一、泛型类的定义和使用 1.1 什么是泛型 在Java中,泛型就是参数化类型,即在定义类、接口或方法时使用类型形参,这些类型形参在使用时才被具体化。使用泛型能够使代码更加通用,安全,简单和易于维护。 1.2 如何定义泛型类 使用尖括号定义类型形参,如<T>。在类的定义中将类型形参…

    Java 2023年5月20日
    00
  • java 如何给对象中的包装类设置默认值

    Java中的包装类(Wrapper Class)是为了让基本数据类型(int、double、char等)具有面向对象的特性而出现的。在Java中,包装类和基本数据类型之间可以进行自动装箱和自动拆箱的转换,方便了编程的过程。在某些情况下,我们需要给对象中的包装类设置默认值,下面是详细讲解“Java 如何给对象中的包装类设置默认值”的攻略。 1. 给包装类设置初…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部