作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用标准 javax.validation 进行属性验证,并使用我自己的验证进行功能验证。简化的子类如下所示:
public class TestData extends AbstractData {
@NotNull
Long id = null;
@NotNull
Long value = null;
public Set<ConstraintViolation<TestData>> validateFunctional() {
Set<ConstraintViolation<TestData>> violations = new HashSet<>();
if ( id < 42 || value > 4711 ) {
//--- here comes another question: how do I create a constraint violation?
}
return violations;
}
}
这是基类:
public abstract class AbstractData {
public Set<ConstraintViolation<?>> validate() {
//--- First validate single properties
Set<ConstraintViolation<?>> violations = validator.validate( this );
}
//--- Single props OK => validate functional
if ( violations.isEmpty()) {
violations.add( validateFunctional());
}
return violations;
}
报错
Type mismatch: cannot convert from Set<ConstraintViolation<AbstractData>> to Set<ConstraintViolation<?>>
最佳答案
我相信这应该是您正在寻找的:
public abstract class AbstractData<T> {
abstract T getObj();
public Set<ConstraintViolation<T>> isValid(){
//do your custom validations if needed
return Validation.buildDefaultValidatorFactory()
.getValidator().validate(getObj());
}
}
要验证的 POJO:
public class Bar extends AbstractData<Bar> {
@NotNull
private Long id;
@NotNull
private Long value;
@CustomConstraint
private Long customConstraint;
@Override
public Bar getObj() {
return this;
}
}
然后只需调用bar.isValid()
即可。
编辑:
关于您关于自定义约束的问题,您可以这样做:
@Constraint(validatedBy = {CustomConstraint.CustomConstraintValidator.class})
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
public @interface CustomConstraint {
String message() default "Invalid value";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
class CustomConstraintValidator implements ConstraintValidator<CustomConstraint, Long> {
@Override
public void initialize(CustomConstraint customConstraint) {
}
@Override
public boolean isValid(Long obj, ConstraintValidatorContext constraintValidatorContext) {
if (obj == null)
return false;
if (obj < 10)
return false;
return true;
}
}
}
在此示例中,如果我使用 @CustomConstraint
注释 Long 字段并传递小于 10 或 null 的值, validator 将返回错误,否则不会返回错误。验证本身在示例中毫无用处,我只是提供了一些内容作为片段供您构建自己的验证。
关于java - 如何在基类上使用 javax.validation (JSR303)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36432600/
我是一名优秀的程序员,十分优秀!