我想通过使用属性来使Java bean验证约束可在春季配置。一个例子:
class Pizza {
@MaxGramsOfCheese(max = "${application.pizza.cheese.max-grams}")
int gramsOfCheese;
}
我无法让它工作或找到太多有关此的文档。
这是可能的吗?我知道消息是可以在验证messages.properties文件中配置的,因此我希望可以使用类似的约束值。
除@madhu bhat外,您还可以配置ConstraintValidator
类以从Spring的Environment
读取属性。
public class MaxGramsOfCheeseValidator implements ConstraintValidator<MaxGramsOfCheese, Integer> {
@Autowired
private Environment env;
private int max;
public void initialize(MaxGramsOfCheese constraintAnnotation) {
this.max = Integer.valueOf(env.resolvePlaceholders(constraintAnnotation.max()));
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return value != null && value <= this.max;
}
}
因此,您可以在具有不同参数的不同字段上使用@MaxGramsOfCheese
注释,这在您的情况下可能更合适。
class Pizza {
@MaxGramsOfCheese(max = "${application.pizza.cheddar.max-grams}")
int gramsOfCheddar;
@MaxGramsOfCheese(max = "${application.pizza.mozerella.max-grams}")
int gramsOfMozerella;
}
对于任何自定义验证,您需要通过实现ConstraintValidator
接口来实现自定义验证器,然后将该自定义验证器提供给创建的自定义验证器。
自定义验证器:
public class MaxGramsOfCheeseValidator implements ConstraintValidator<MaxGramsOfCheese, Integer> {
@Value("${application.pizza.cheese.max-grams}")
protected int maxValue;
@Override
public void initialize(MaxGramsOfCheese constraintAnnotation) {
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return value != null && value <= maxValue;
}
}
自定义验证注释:
@Documented
@Constraint(validatedBy = {MaxGramsOfCheeseValidator.class})
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MaxGramsOfCheese {
String message() default "Some issue here"; //message to be returned on validation failure
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
使用自定义验证注释:
class Pizza {
@MaxGramsOfCheese
int gramsOfCheese;
}
请注意,如果您希望从属性文件访问注释的值,则必须在自定义验证器中提供。