如何在 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;
// ...
}
我在 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;
// ...
}