【问题标题】:ClassCastException when using Bean Validation with weld将 Bean 验证与焊接一起使用时出现 ClassCastException
【发布时间】:2013-09-17 01:55:10
【问题描述】:

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

有办法解决这个问题吗?

【问题讨论】:

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


    【解决方案1】:

    这是哪个版本的 Hibernate Validator?

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

    【讨论】:

    • Gunnar,我应该使用 hibernate-validator-cdi 代替 hibernate-validator 吗?
    • 是的,一定要使用 hibernate-validator-cdi。这是我们提供的 CDI 可移植扩展,它为您提供 Bean Validation 和 CDI 之间的集成。这样你也不需要自己的 ValidatorFactory producer 方法,因为扩展为 ValidatorValidatorFactory 提供了 beans。
    • 所以说我不应该使用hibernate-validator jar 而是使用hibernate-validator-cdi jar 是否正确?我正在尝试解决类似的问题:stackoverflow.com/questions/40555721/…。请指教。
    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多