使用Spring 4从Hibernate 3升级到4后Hibernate Validator的问题
我接手了一个非常古老的Java项目(富客户端,swing,hibernate 3),它有一些自行开发的依赖注入,使用Hibernate 3,它有手动事务管理。这意味着每个freakin DAO方法都会获得一个触发会话打开的布尔值。你可以想象当你在许多地方触摸那个脆弱的构造时这意味着什么......无论如何,我不是在抱怨......这是我的问题:
我必须实现一个新的复杂功能,很快就会意识到整个手动事务处理失控了,我可以说服客户重构整个事情,将Spring事务管理与hibernate 4结合使用。
所以我开始实现这一点,在我遇到一些重大问题之后,整个事情现在都在运行,但有一些更详细的关键。
让我疯狂的是 Hibernate Validator 。我猜现有的实现方式是老式的。所有实体类派生自名为DomainObject的类,该类包含项目中存在的所有实体的org.hibernate.validator.ClassValidator
。
在实体本身中,将使用.InvalidValues()调用此验证器来验证字段。
因为我使用Spring 4.2.4升级到Hibernate-Core 4.3.6.Final.RELEASE我要在验证实体时遇到很多问题。我知道我使用的是旧的验证器版本但是当我升级到更高版本时,整个项目都有无数错误,例如The type org.hibernate.validator.InvalidValue cannot be resolved. It is indirectly referenced from required .class files
,但是我无法通过我在SO上找到的所有答案来解决这个问题。
现在导致错误的验证在SwingWorker Thread
中运行,在调试时我可以看到异常在Spring的某个地方被吞噬,我甚至没有得到堆栈跟踪:-(
我认为问题仍然来自hibernate依赖项的错误组合,但我真的很绝望,直到我得到了一些可以协同工作的东西
你可以在下面的pom.xml片段中看到。
这里是片段
<!-- Hibernate Stuff -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.6.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.6-Final</version>
<!-- Hibernate Core needs a higher version so we exclude this one -->
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>3.2.0.Final</version>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.2.Final</version>
</dependency>
<!-- <dependency> -->
<!-- <groupId>org.hibernate</groupId> -->
<!-- <artifactId>hibernate-c3p0</artifactId> -->
<!-- <version>3.6.10.Final</version> -->
<!-- </dependency> -->
<!-- <dependency> -->
<!-- <groupId>javassist</groupId> -->
<!-- <artifactId>javassist</artifactId> -->
<!-- <version>3.12.0.GA</version> -->
<!-- </dependency> -->
<!-- <dependency> -->
<!-- <groupId>c3p0</groupId> -->
<!-- <artifactId>c3p0</artifactId> -->
<!-- <version>0.9.1.2</version> -->
<!-- </dependency> -->
这是在验证期间将调用的所有实体中的方法。
/**
* validate the entity. This method will be called internally before save or
* update to check validity before sql statements
*/
@Override
@Transient
protected InvalidValue[] validate(final String fieldName) {
if (fieldName == null) {
return VALIDATOR_ASSEMBLY_ENTRY.getInvalidValues(this);
} else {
return VALIDATOR_ASSEMBLY_ENTRY.getInvalidValues(this, fieldName);
}
}
任何提示?如果您需要更多代码,请告诉我。整个Spring和Hibernate配置都是用Java完成的。没有xml。
答案 0 :(得分:0)
我通过一些解决方法解决了这个问题。把它放在你的pom.xml
中<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-legacy</artifactId>
<version>4.0.2.GA</version>
</dependency>