具有可配置约束值的Spring Bean验证

时间:2019-07-07 09:33:51

标签: java spring bean-validation

我想使Java Bean验证约束可以由Spring配置,可能使用属性。一个例子:

class Pizza {

    @MaxGramsOfCheese(max = "${application.pizza.cheese.max-grams}")
    int gramsOfCheese;

}

我无法使它正常工作或找到很多与此有关的文档。

像这样甚至有可能吗?我知道消息可以在Validationmessages.properties文件中进行配置,因此我希望约束值可能有类似的事情。

2 个答案:

答案 0 :(得分:2)

对于任何自定义验证,您需要通过实现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;

}

请注意,如果要从属性文件访问注释的值,则必须在自定义验证器中提供该值,如图所示。

答案 1 :(得分:1)

除了@Madhu Bhat之外,您还可以配置<link rel="stylesheet" type="text/css" href="https://iamceege.github.io/tooltipster/dist/css/tooltipster.bundle.min.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://iamceege.github.io/tooltipster/dist/js/tooltipster.bundle.js"></script> <div id="myDiv"> <p>Lorem ipsum dolor sit, amet consectetur <span data-tooltip-content="#tooltip_content1" class="tooltip">adipisicing</span> elit. Omnis labore, molestiae rem accusantium culpa tempore repudiandae at, ab, fuga quos itaque totam excepturi in commodi eaque quidem sunt voluptates facilis!</p> <p>Lorem, ipsum dolor sit amet <span data-tooltip-content="#tooltip_content2" class="tooltip">consectetur</span> adipisicing elit. Optio illum nam molestiae voluptate dolorem fugiat quos. Ea delectus laboriosam dolores totam. Temporibus similique fugiat ipsa praesentium neque, eius perspiciatis explicabo. Vitae assumenda repellat voluptatum iusto laborum quae obcaecati minus minima labore nemo, dolore aut blanditiis sunt unde inventore quod eaque enim aliquam nostrum veniam magni quibusdam ipsa dolores. Suscipit saepe totam nihil cumque ab minus blanditiis reprehenderit, maxime eveniet, omnis dolorum necessitatibus! Laboriosam, ipsa reiciendis. Aut quasi explicabo illo quis dignissimos? At, dolorem. Vero, odio placeat! Magni fugiat rem ut modi neque quod, nihil maiores sequi error ipsam in suscipit!</p> <p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Optio illum nam molestiae voluptate dolorem fugiat quos. Ea delectus laboriosam dolores totam. Temporibus similique fugiat ipsa praesentium neque, eius perspiciatis explicabo. Vitae assumenda repellat voluptatum iusto laborum quae obcaecati minus minima labore nemo, dolore aut blanditiis sunt unde inventore quod eaque enim aliquam nostrum veniam magni quibusdam ipsa dolores. Suscipit saepe totam nihil cumque ab minus blanditiis reprehenderit, maxime eveniet, omnis dolorum necessitatibus! Laboriosam, ipsa reiciendis. Aut quasi explicabo illo quis dignissimos? At, dolorem. Vero, odio placeat! Magni fugiat rem ut modi neque quod, nihil maiores sequi error ipsam in suscipit!</p> <p>Lorem, ipsum dolor sit amet <span data-tooltip-content="#tooltip_content2" class="tooltip">consectetur</span> adipisicing elit. Optio illum nam molestiae voluptate dolorem fugiat quos. Ea delectus laboriosam dolores totam. Temporibus similique fugiat ipsa praesentium neque, eius perspiciatis explicabo. Vitae assumenda repellat voluptatum iusto laborum quae obcaecati minus minima labore nemo, dolore aut blanditiis sunt unde inventore quod eaque enim aliquam nostrum veniam magni quibusdam ipsa dolores. Suscipit saepe totam nihil cumque ab minus blanditiis reprehenderit, maxime eveniet, omnis dolorum necessitatibus! Laboriosam, ipsa reiciendis. Aut quasi explicabo illo quis dignissimos? At, dolorem. Vero, odio placeat! Magni fugiat rem ut modi neque quod, nihil maiores sequi error ipsam in suscipit!</p> </div> <div class="tooltip_templates"> <span id="tooltip_content1"> <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat hic qui nulla cum voluptatum unde consequuntur repellendus eligendi! Et dignissimos, explicabo recusandae quidem iste aut? Cumque, omnis unde a ex modi, consequatur pariatur eius eaque dolores neque excepturi maiores facere incidunt nesciunt temporibus enim natus numquam sed recusandae! Beatae, sunt!</p> </span> </div> <div class="tooltip_templates"> <span id="tooltip_content2"> <p>Lorem ipsum dolor sit amet.</p> </span> </div> <div class="tooltip_templates"> <span id="tooltip_content3"> <p>Lorem ipsum dolor sit amet.</p> </span> </div>类以从Spring的ConstraintValidator读取属性。

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