使用Spring 4从Hibernate 3升级到4后,Hibernate Validator的问题

时间:2017-04-05 07:24:02

标签: java spring hibernate validation hibernate-validator

使用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。

1 个答案:

答案 0 :(得分:0)

我通过一些解决方法解决了这个问题。把它放在你的pom.xml

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator-legacy</artifactId>
    <version>4.0.2.GA</version> 
</dependency>