我想让JavaBean验证约束可以通过Spring进行配置,也可以使用属性。例如:
class Pizza {
@MaxGramsOfCheese(max = "${application.pizza.cheese.max-grams}")
int gramsOfCheese;
}
我还没能把这个应用到工作中,或者找到很多关于这个的文档。
这样的事情可能吗?我知道消息在Validationmessages中是可配置的。属性文件,所以我希望约束值也可以有类似的结果。
对于任何自定义验证,您需要通过实现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;
}
注意,如果希望从属性文件访问注释的值,则必须在自定义验证器中提供该值,如图所示。
除了@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创建一个自定义验证器 我知道您通常会创建这样的单独注释: 但对我来说,这似乎是双重代码;-) 如何注册要与一起使用的自定义验证器?