带有可配置约束值的弹簧bean验证



我想通过使用属性来使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;
}

请注意,如果您希望从属性文件访问注释的值,则必须在自定义验证器中提供。

最新更新