模型是通过一些工具生成的。特定字段通过@NotNull 注释进行注释。我无法修改生成的类。我需要对生成的类进行附加验证,例如检查字符串字段的值是否不包含空字符串,然后抛出 ConstraintViolationException。目前,我迭代该类以查找 String 的字段类型,然后在空字符串的情况下,我需要实现自己的 ConstraintViolation 接口,这是非常困难的。所以它看起来像这样:
Validator validator = Validation.buildDefaultValidatorFactory()
.getValidator();
Set< ConstraintViolation< E > > validationErrors = validator.validate(aEntity);
Field[] fields = aEntity.getClass().getDeclaredFields();
for (Field f : fields) {
Class<?> type = f.getType();
if (type == String.class) {
try {
String v = (String) f.get(aEntity);
// check that value is not an empty string
if (v == null || !v.trim().isEmpty()) {
validationErrors.add(new ConstraintViolation<E>() {
@Override
public String getMessage() {
return null;
}
@Override
public String getMessageTemplate() {
return null;
}
@Override
public E getRootBean() {
return null;
}
@Override
public Class<E> getRootBeanClass() {
return null;
}
@Override
public Object getLeafBean() {
return null;
}
@Override
public Object[] getExecutableParameters() {
return new Object[0];
}
@Override
public Object getExecutableReturnValue() {
return null;
}
@Override
public Path getPropertyPath() {
return null;
}
@Override
public Object getInvalidValue() {
return null;
}
@Override
public ConstraintDescriptor<?> getConstraintDescriptor() {
return null;
}
@Override
public <U> U unwrap(Class<U> type) {
return null;
}
});
}
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
是否可以让这变得更容易?
对于无法编辑类以向其添加验证注释的情况,有两种选择:
要使用这种方法,您需要添加一个
META-INF/validation.xml
,然后在其中您可以定义/重新定义您的约束:
<?xml version="1.0" encoding="UTF-8"?>
<constraint-mappings
xmlns="https://jakarta.ee/xml/ns/validation/mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
https://jakarta.ee/xml/ns/validation/mapping
https://jakarta.ee/xml/ns/validation/validation-mapping-3.0.xsd"
version="3.0">
<!-- note that you can use ignore-annotations
to either ignore any annotation constraints
or include them, depending on your needs -->
<bean class="com.acme.common.model.SomeType" ignore-annotations="false">
<field name="someField">
<constraint annotation="jakarta.validation.constraints.NotBlank"/>
[...]
</field>
[...]
</bean>
</constraint-mappings>
有关更多详细信息,您应该检查规范的这一部分。
或者,Hibernate Validator 提供了一种以编程方式添加约束的方法:
HibernateValidatorConfiguration configuration = Validation
.byProvider( HibernateValidator.class )
.configure();
ConstraintMapping constraintMapping = configuration.createConstraintMapping();
constraintMapping
.type( Car.class )
.field( "manufacturer" )
.constraint( new NotNullDef() )
.field( "licensePlate" )
.ignoreAnnotations( true )
.constraint( new NotNullDef() )
.constraint( new SizeDef().min( 2 ).max( 14 ) )
.type( RentalCar.class )
.getter( "rentalStation" )
.constraint( new NotNullDef() );
Validator validator = configuration.addMapping( constraintMapping )
.buildValidatorFactory()
.getValidator();
有关更多详细信息,请查看 Hibernate Validator 文档的部分。
如果您不知道哪些字段不需要应用空/空白约束,您可以尝试使用反射迭代字段,然后根据该信息通过编程 API 定义约束。将约束添加到验证器后,您应该能够使用
Validator#validate(..)