gpt4 book ai didi

java - 如何在基类上使用 javax.validation (JSR303)?

转载 作者:行者123 更新时间:2023-11-30 07:28:54 24 4
gpt4 key购买 nike

我想使用标准 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/

24 4 0
文章推荐: java - 架构:填充 Hashmap 时如何解决 GC 开销问题
文章推荐: javascript - 想要 : simple HTML file that does disclosure triangle
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com