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

下面就为大家详细讲解“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日

相关文章

  • Netty粘包拆包及使用原理详解

    Netty粘包拆包及使用原理详解 在使用Netty进行网络编程时,可能会遇到粘包或拆包的问题,本文将详细讲解Netty粘包拆包的原因和解决方案,并提供两个示例帮助理解。 什么是粘包和拆包 在网络通信中,发送端将多个小的数据包合并成一个大的数据包发送给接收端,称为粘包;接收端在接收数据时,将一个大的数据包拆分成多个小的数据包,称为拆包。由于网络传输是面向字节流…

    Java 2023年5月20日
    00
  • Kafka利用Java实现数据的生产和消费实例教程

    Kafka利用Java实现数据的生产和消费实例教程 Kafka是一个高性能的分布式消息队列,可以用于实现各种系统之间的异步通信以及数据流的处理。本文将介绍如何使用Java实现Kafka的数据生产和消费。以下是详细的步骤: 步骤一:安装和启动Kafka服务器 在开始使用Kafka之前,需要先安装Kafka服务器。Kafka服务器的安装过程可以参考Kafka官方…

    Java 2023年5月20日
    00
  • 深入浅出Java中重试机制的多种方式

    深入浅出Java中重试机制的多种方式 在开发中,有时会需要对某些操作进行多次尝试,以增加操作的稳定性和可靠性。这时,使用重试机制可以很好地解决这一问题。本文将详细介绍Java中重试机制的多种实现方式。 1. 基于while循环的重试机制 最简单的重试机制就是在while循环中执行某个操作,并在某些限定条件下进行多次尝试。例如以下示例代码: int count…

    Java 2023年5月27日
    00
  • Java实例化一个抽象类对象的方法教程

    Java实例化一个抽象类对象的方法教程 在Java中定义一个抽象类时,它只是一个类的模板,并且不能直接实例化。但是,有时候我们会需要创建一个该抽象类的实例。那么,如何实例化一个抽象类对象呢? 1.使用匿名内部类 使用匿名内部类是实例化抽象类对象的一种常见方法。这种方法利用了Java的多态性,创建一个继承抽象类的实现类的匿名对象。 示例代码: abstract…

    Java 2023年5月26日
    00
  • ANGULARJS中用NG-BIND指令实现单向绑定的例子

    下面我将详细讲解关于 ANGULARJS 中使用 ng-bind 指令实现单向绑定的攻略,主要分为以下几个方面。 什么是 ng-bind 指令? ng-bind 是 ANGULARJS 框架中用于将数据值绑定到 HTML 元素中的指令,它用于在模板中动态绑定数据,可以通过变化自动更新绑定数据的值,实现实时更新数据,具体用法如下: <div ng-bin…

    Java 2023年6月15日
    00
  • JS实现鼠标移上去显示图片或微信二维码

    要实现鼠标移上去显示图片或微信二维码,可以使用JavaScript中DOM元素的事件和属性,具体的步骤如下: 首先,在HTML代码中,我们需要定义一个目标元素,即需要触发鼠标移动事件的元素。可以给这个元素设置一个id属性,方便在JavaScript中获取它的引用。例如: <div id="target">鼠标移上去触发事件&l…

    Java 2023年5月23日
    00
  • Java实现弹窗效果的基本操作

    下面就带大家详细讲解Java实现弹窗效果的基本操作。 一、基本概念 弹窗效果通常是指在打开网页或者程序时,弹出一个对话框,提示用户进行操作或者展示一些信息。 在Java中,我们可以通过调用JOptionPane类实现弹窗效果。JOptionPane是Swing提供的对话框框架,包括很多不同类型的对话框,如消息对话框、选择对话框、输入对话框等。我们可以根据不同…

    Java 2023年5月18日
    00
  • 详解Springboot配置文件的使用

    下面是“详解Springboot配置文件的使用”的完整攻略。 什么是Springboot配置文件? Springboot的配置文件是一个以properties或yml为扩展名的文件,用于配置Springboot应用程序的参数。 在Springboot中,我们可以通过配置文件来轻松地配置应用程序的各种参数,例如:端口号、数据源、日志、邮件等等。 配置文件的使用…

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