1

错误:

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;
      }
  }
4

2 回答 2

1

我认为问题在于您的编译器不知道您的 beanType 变量的类型与集合匹配。尝试这样的事情(代码可能需要稍微调整一下)

public <T> class validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups)

然后改变:

 final Set<ConstraintViolation<Class<?>>>

 final Set<ConstraintViolation<Class<T>>>
于 2011-05-16T23:28:14.227 回答
0

@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;
}
于 2011-05-17T00:15:58.113 回答