当前位置: 首页 > 知识库问答 >
问题:

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

范修伟
2023-03-14

我想让JavaBean验证约束可以通过Spring进行配置,也可以使用属性。例如:

class Pizza {

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

}

我还没能把这个应用到工作中,或者找到很多关于这个的文档。

这样的事情可能吗?我知道消息在Validationmessages中是可配置的。属性文件,所以我希望约束值也可以有类似的结果。

共有2个答案

益和雅
2023-03-14

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

}

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

子车安和
2023-03-14

除了@Madhu Bhat之外,您还可以配置ConstraintValidator类来从Spring的环境中读取属性。

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;

}
 类似资料:
  • 我想制作一个AngularJS Spring MVC Hibernate MySQL应用程序。我不知道如何配置SpringBean,这样我就可以对我的存储库和实体类使用自动连接的注释。 pom.xml依赖: 实体类: 的存储库: 的控制器: 配置类:

  • 我使用的是Swagger(1.5.8),我想让我的定义检测DTO上的JSR-303注释,这样我就可以记录API的验证约束。 我希望注释(如本例)会显示关于最小值(44)的一些信息,但它不会。 由此产生的是: Swagger已经关闭了该功能的拉取请求,但我不清楚它在Swagger定义中的位置/方式。 我希望能够做这样的事情: 配置Swagger模块/插件以启用和等功能的首选方法是什么,以便他们检查我

  • 我对Postgres Unique约束有问题,该约束包含多个可能包含空值的列。 让我们假设这种情况: Insert将插入('foo',bar')一次和('foo',NULL)两次(尽管直觉告诉它应该插入一次)。 在这种情况下,解决方案非常简单。我可以添加唯一的索引 但是当有更多的列和不同的类型(不仅仅是文本)时,问题就开始了。假设我们有10列,其中9列可以有值。也许我可以用大量的限制来解决它,但这

  • 我有一个结构如下的表, 如果学校处于活动状态,即< code>isDeleted = false 我不确定如何为只取一个值的字段设置唯一约束。布尔字段

  • 我有一个DTO,有几个字段,用户名,密码和电子邮件所有这些字符串。 我也有一个列表,我想作为一个可选的,这意味着它不必从表单中传递,可以留空。 这应该在前端有效: 因此,我们应该: javax中是否有@OptionalField注释之类的内容。验证。限制? 还是我唯一的选择是两个独立的DTO?

  • 我在项目中使用bean验证,我想为现有的约束注释编写一个自定义验证器。 例如,我有一个类,它表示一个名为CustomDateTime的日期/时间。在使用此类作为例如出生日期的类中,我想用过去的日期对字段进行注释: 然后,我通过实现ConstraintValidator创建一个自定义验证器 我知道您通常会创建这样的单独注释: 但对我来说,这似乎是双重代码;-) 如何注册要与一起使用的自定义验证器?