使用Bean验证和焊接时的ClassCastException

时间:2013-09-16 09:22:16

标签: bean-validation hibernate-validator jboss-weld

我正在使用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方法。

有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

这是哪个版本的Hibernate Validator?

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