错误:
Type mismatch: cannot convert from Set<ConstraintViolation<capture#1-of ?>> to Set<ConstraintViolation<Class<?>>>
我的代码:
public class validateValue(Class<?> beanType, String propertyName, Object value, Class<?>... groups){
TraversableResolver tr = new MyTraversableResolver();
Validator validator = Validation.buildDefaultValidatorFactory().usingContext().traversableResolver(tr).getValidator();
final Set<ConstraintViolation<Class<?>>> constraintViolations = validator.validateValue(beanType, propertyName, value, groups);
}
private class MyTraversableResolver implements TraversableResolver {
public boolean isReachable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) {
return traversableObject == null || Hibernate.isInitialized(traversableObject);
}
public boolean isCascadable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) {
return true;
}
}
最佳答案
@JustinKSU关于将通配符(?)更改为arg(T)类型是正确的。另一个问题是validator.validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups)
不会在类型的类上返回一组约束违规,这将是:
Set<ConstraintViolation<Class<T>>>
...但是它返回关于类型的一组约束违规:
Set<ConstraintViolation<T>>
可以看到这是一个细微的差别,但是如果您仔细检查错误消息并计算尖括号,这将很明显。
因此,您的代码应如下所示。出于示例目的,我简化了验证器的创建。我还添加了一个返回值,因为我假设您想对结果做些事情。
public <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) {
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
final Set<ConstraintViolation<T>> constraintViolations = validator.validateValue(beanType, propertyName, value, groups);
return constraintViolations;
}