在Spring-boot项目中自定一个Validation Annotaion

本文介绍如何在Spring Boot项目中自定义Validation Annotation,并通过示例代码详细讲解了自定义验证注解的过程,包括定义注解、实现验证逻辑及与验证组结合使用的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Spring-boot项目中自定一个Validation Annotaion

javax.validation:validation-apijavax.validation.constraints定义诸如Null, Max, Min这样的这样的Annotation。在大多数情况下,这些Annotation已经够用了,但是我们还是要了解一下如何自己定义一个Annotaion来实现自己想要的验证方式。

定义一个自己的验证的Annotaion

package my.pinkyo.demo.validation;

import org.hibernate.validator.constraints.NotBlank;

import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.NotNull;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RUNTIME)
@Constraint(validatedBy = AlphaDigitOnlyValidator.class)
@Documented
@NotBlank
public @interface AlphaDigitOnly {
    String message() default "can only have alpha digit.";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

    /**
     * Defines several {@link NotNull} annotations on the same element.
     *
     * @see NotNull
     */
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    @interface List {

        NotNull[] value();
    }
}

定义完Annotation就要实现验证这个字段的方式,就是完成my.pinkyo.demo.validation.AlphaDigitOnlyValidator,代码如下:

package my.pinkyo.demo.validation;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Objects;

public class AlphaDigitOnlyValidator implements ConstraintValidator<AlphaDigitOnly, CharSequence> {
    @Override
    public void initialize(AlphaDigitOnly constraintAnnotation) {
        // do nothing.
    }

    @Override
    public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
        if (Objects.nonNull(value)
            && !value.toString().matches("[a-zA-Z0-9]*")) {
            return false;
        }
        return true;
    }
}

在这个验证中,要求被验证的字段是字符串,不为且只能由字母数字组成。

一般情况下,到这一步我们定义自已的验证Annotation事情已经做完了。但是如果你的这个Annotation要和group一起使用就要再多点儿考虑了。

定义自己的Group

在Hibernate-Validator中,Group必须为interface,所以我们可以定义一个Group如下:

package my.pinkyo.demo.valiation;

public interface Insert {
}

这样我们就可以在Modal里面使用这个Group了,例如:

public class User {
    ...
    @AlphaDigitOnly(groups = {Update.class, Insert.class})
    private String name;
    ...
}

但是我们要考虑一个惯例:如果一个Annotation没有设置Group,则应该对于所有的Group都要进行字段的验证。但是,如上的定义完以后的效果却是,如果不定义Group,则对所有的Group都不生效,与惯例不一样,要特别注意

### spring-boot-starter-validation 是什么? `spring-boot-starter-validation` 是 Spring Boot 提供的一个启动器依赖,用于简化 Java Bean Validation 的集成。它基于 Jakarta Bean Validation(JSR 380)规范,允许开发者通过注解的方式对 Java Bean 的属性进行校验,从而减少手动编写验证逻辑的代码量。 该启动器默认引入了 Jakarta Validation API 和 Hibernate Validator 实现,使得诸如 `@NotNull`、`@NotBlank`、`@Email`、`@Pattern` 等注解可以直接在项目中使用[^1]。开发者无需额外配置即可直接使用 `@Valid` 或 `@Validated` 注解来触发参数校验逻辑,尤其是在控制器方法中接收请求参数时非常常见。 例如,在一个 Spring MVC 控制器中可以这样使用: ```java @RestController public class UserController { @PostMapping("/users") public ResponseEntity<String> createUser(@Valid @RequestBody User user) { return ResponseEntity.ok("User is valid"); } } ``` ### 包含 spring-boot-starter-validationSpring Boot 依赖包 `spring-boot-starter-validation` 被包含在 Spring Boot 官方提供的多个 starter 模块中,尤其是那些涉及 Web 功能的模块。最常见的是: - **spring-boot-starter-web**:这是构建 Web 应用程序的核心启动器,内部默认引入了 `spring-boot-starter-validation`,因此只要项目中使用了 Web 模块,就不需要再单独添加 Validation 启动器[^2]。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` - **spring-boot-starter-thymeleaf**、**spring-boot-starter-data-rest** 等其他依赖也可能间接引入该模块,但主要依赖关系仍然来自 `spring-boot-starter-web`。 如果项目不使用 Web 模块但仍需要启用 Bean Validation 功能,则应显式添加 `spring-boot-starter-validation` 依赖[^3]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> ``` ### 参数校验使用概要 Spring Boot 支持两种常用的参数校验方式:`@Valid` 和 `@Validated`。它们的区别在于: - `@Valid`:是标准的 Jakarta Bean Validation 注解,适用于方法参数级别的校验,常用于 Controller 层的方法入参校验。 - `@Validated`:是 Spring 提供的注解,支持类级别校验,并且可以在非 Controller 场景中使用,例如 Service 层或通过 AOP 实现校验。 在校验失败时,可以通过 `@ExceptionHandler` 或 `@ControllerAdvice` 捕获 `MethodArgumentNotValidException` 异常并返回统一的错误响应格式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值