使用jakarta.validation自定義校驗規則

漠孤烟發表於2024-08-21

jakarta.validation是一套資料校驗的規範,內建了NotBlank, NotNull, Min, Pattern等校驗註解外,還提供了自定義註解進行任意校驗規則的擴充套件。
依賴包為:

        <dependency>
            <groupId>jakarta.validation</groupId>
            <artifactId>jakarta.validation-api</artifactId>
			<version>3.0.2</version>
        </dependency>

這是一個介面規範包,不包含實現。實現jakarta.validation規範的框架有hibernate-validator,只需要pom.xml裡引入該依賴

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

但程式碼裡無任何hibernate-validator的import依賴,想切換到其他家的實現時,只需pom.xml裡改一下,
程式碼可以不用任何修改,這也是Jakarta EE的一向主張:面象介面程式設計,依賴包也是如此,介面包和實現包分離,業務程式碼只依賴介面包,不依賴具體實現包。

示例

使用註解來校驗值是否為一個合格的cron表示式。

1、建立annotation

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IsCronExpression {

    String message() default "表示式格式錯誤";

    //分組校驗
    Class<?>[] groups() default {};

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

2、建立對應的校驗器

public class IsCronExpressionValidator implements ConstraintValidator<IsCronExpression, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        try {
            CronExpression.parse(value);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

3、在IsCronExpression 上指定校驗器

@Constraint(validatedBy = {IsCronExpressionValidator.class})

4、使用 @IsCronExpression

@Data
public class TaskRequest {

    @NotBlank
    private String taskName;

    @NotBlank
    private String description;

    /**
     * 表示式
     */
    @NotBlank
    @IsCronExpression
    private String taskCron;
    
}

相關文章