如何在 javax.validation 注释中使用 application.properties 值

How to use application.properties values in javax.validation annotations

我在 application.yaml 文件中有一个名为 notification.max-time-to-live 的变量,我想将其用作 javax.validation.constraints.@Max() 注释的值。

我尝试了很多方法(使用env.getProperty()、@Value 等),它说它必须是一个常量值,有什么办法可以做到这一点吗?

我知道这个 没有直接回答我的问题 ,正如 M. Deinum 已经说过的那样,答案是 没有 。尽管如此,这是一个简单的解决方法。

确实 @Max 和其他 javax 注释不允许我们使用动态值,但是,我们可以创建一个自定义注释(如 M. Deinum 建议的那样),使用 application.yaml 中的值spring @Value.

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = ValidTimeToLiveValidator.class)
public @interface ValidTimeToLive {

    String message() default "must be less than or equal to %s";

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

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

以及相应的验证器。

public class ValidTimeToLiveValidator implements ConstraintValidator<ValidTimeToLive, Integer> {

    @Value("${notification.max-time-to-live}")
    private int maxTimeToLive;

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        // leave null-checking to @NotNull
        if (value == null) {
            return true;
        }
        formatMessage(context);
        return value <= maxTimeToLive;
    }

    private void formatMessage(ConstraintValidatorContext context) {
        String msg = context.getDefaultConstraintMessageTemplate();
        String formattedMsg = String.format(msg, this.maxTimeToLive);
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(formattedMsg)
               .addConstraintViolation();
    }
}

现在我们只需要在相应的 class.

中添加这个自定义注释
public class Notification {

    private String id;
 
    @ValidTimeToLive
    private Integer timeToLive;

    // ...
}