有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用应用程序。javax中的属性值。验证注释

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

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


共 (1) 个答案

  1. # 1 楼答案

    我知道这并不能直接回答我的问题,正如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();
        }
    }
    

    现在我们只需要在相应的类中添加这个自定义注释

    public class Notification {
    
        private String id;
     
        @ValidTimeToLive
        private Integer timeToLive;
    
        // ...
    }