0

我正在使用 Weld (org.jboss.weld.servlet:weld-servlet:2.0.2.Final 和 maven) 在 Tomcat 中运行一个应用程序来生成 ValidatorFactory 和 Validator 组件,如下所示:

@Produces 
@Default 
@javax.enterprise.context.ApplicationScoped
public ValidatorFactory getInstance() {
    return Validation.byDefaultProvider().configure().buildValidatorFactory();
}

@Produces @javax.enterprise.context.ApplicationScoped
public Validator getInstanceValidator() {
    return factory.getValidator();
}

当我注入Validator和调用方法Validator.forExecutables()时,我得到了这个异常:

org.jboss.weld.proxies.Validator$1284425531$Proxy$_$$_WeldClientProxy 
cannot be cast to javax.validation.executable

但如果我注入ValidatorFactory和调用ValidatorFactory.getValidator().forExecutables(),一切正常。

我的代码有错误吗?还是有其他程序可以避免此错误?

编辑

分析 Hibernate 验证器源代码,我看到 ValidatorImpl 实现了 Validator 和 ExecutableValidator 接口。当weld 创建代理时,它只实现Validator 接口中的方法,而不是ExecutableValidator 方法。

有办法解决这个问题吗?

4

1 回答 1

1

这是哪个版本的 Hibernate Validator?

实际上 Hibernate Validator 的 CDI ValidatorBean也作为类型返回ExecutableValidator,所以应该为此创建代理。我隐约记得我们在 Beta 版本中遇到过这个问题,所以你可能还在使用那个版本。

于 2013-09-16T17:55:10.887 回答