我正在使用Weld(org.jboss.weld.servlet:weld-servlet:2.0.2.Final with 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方法。
有办法解决这个问题吗?
答案 0 :(得分:1)
这是哪个版本的Hibernate Validator?
实际上Hibernate Validator的CDI ValidatorBean也会返回ExecutableValidator
类型,因此应该为此创建代理。我依稀记得我们在Beta版本中遇到过这个问题,所以可能你还在使用那个版本。