使用Hibernate Bean验证时出现ClassCastException

时间:2014-11-28 14:41:38

标签: java jboss bean-validation classcastexception

这是我的第一个问题,所以请耐心等待我:)

我正在尝试使用bean验证来实现评估系统数据质量的框架。我的系统使用JBoss 7.1.1和Hibernate 5.1.3。作为第一步,我想输出一些简单的验证统计信息,例如每个约束类型的违规百分比。为此,我想首先获得我在每个实体中声明的所有约束注释(目前我只有类级别和字段约束)。我以为我已经找到了一种方法,通过将我的ConstraintDescriptors转换为ConstraintDescriptorImpl,然后在其上调用getAnnotationType()方法(可能有一种更优雅的方式来做我想要的,但这可能属于另一个问题)。这一切都很好,但在运行时我得到以下异常:

java.lang.ClassCastException: org.hibernate.validator.metadata.ConstraintDescriptorImpl cannot be cast to org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl

这里发生了什么? ConstraintDescriptorImpl在hibernate-validator-5.1.3 JAR中的位置是org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl,我在导入时使用它。经过一些谷歌搜索,我发现org.hibernate.validator.metadata.ConstraintDescriptorImpl是hibernate-validator-4.x中类的位置。事实上,我尝试在我的路径上添加hibernate-validator-4.1.0 JAR,整个过程很顺利。但这似乎没有回答我的问题(我想使用5.1.3版本)。

由于我没有在项目的其他任何地方使用hibernate-validator-4.x,我怀疑在其模块中包含hibernate-validator-4.2的JBoss可能是罪魁祸首。但话又说回来可能是Hibernate验证器问题。在任何情况下,我都不知道如何解决甚至调试问题 - 任何帮助将不胜感激!

谢谢:)

1 个答案:

答案 0 :(得分:0)

您的假设是正确的,JBoss AS 7确实将Hibernate Validator 4捆绑在其modules目录中。 Hibernate Validator 4.2.0.Final是精确的,它位于 modules / org / hibernate / validator / main 中。 AS 7使用Hibernate Validator来满足EE 6规范的Bean Validation要求(Hibernate Validator 4是Bean Valdiation 1.0的参考实现)。

如果要将不同版本的Validator与AS 7应用程序捆绑在一起,则需要使用 jboss-deployment-structure.xml 来排除验证模块。另请参阅https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7