bean验证 - hibernate错误

时间:2010-07-19 13:44:58

标签: java hibernate spring validation

我在尝试运行命令行应用程序时遇到异常:

java.lang.ExceptionInInitializerError
        at org.hibernate.validator.engine.ConfigurationImpl.<clinit>(ConfigurationImpl.java:52)
        at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:43)
        at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:269)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -2
        at java.lang.String.substring(String.java:1937)
        at org.hibernate.validator.util.Version.<clinit>(Version.java:39)
        ... 34 more

我做错了吗?请建议。

2 个答案:

答案 0 :(得分:1)

这很奇怪。我将static o.h.v.u.Version初始化块的相关部分粘贴到一个带main的类中,并添加了一些穷人的日志记录:

public class VersionTest {
    public static void main(String[] args) {
        Class clazz = org.hibernate.validator.util.Version.class;

        String classFileName = clazz.getSimpleName() + ".class";
        System.out.println(String.format("%-16s: %s", "classFileName", classFileName));

        String classFilePath = clazz.getCanonicalName().replace('.', '/') + ".class";
        System.out.println(String.format("%-16s: %s", "classFilePath", classFilePath));

        String pathToThisClass = clazz.getResource(classFileName).toString();
        System.out.println(String.format("%-16s: %s", "pathToThisClass", pathToThisClass));

        // This is line 39 of `org.hibernate.validator.util.Version`
        String pathToManifest = pathToThisClass.substring(0, pathToThisClass.indexOf(classFilePath) - 1)
            + "/META-INF/MANIFEST.MF";
        System.out.println(String.format("%-16s: %s", "pathToManifest", pathToManifest));
    }
}

这是运行时得到的输出:

classFileName   : Version.class
classFilePath   : org/hibernate/validator/util/Version.class
pathToThisClass : jar:file:/home/pascal/.m2/repository/org/hibernate/hibernate-validator/4.0.2.GA/hibernate-validator-4.0.2.GA.jar!/org/hibernate/validator/util/Version.class
pathToManifest  : jar:file:/home/pascal/.m2/repository/org/hibernate/hibernate-validator/4.0.2.GA/hibernate-validator-4.0.2.GA.jar!/META-INF/MANIFEST.MF

在您的情况下,StringIndexOutOfBoundsException: String index out of range: -2表示:

pathToThisClass.indexOf( classFilePath )

正在返回-1,使pathToThisClass.substring(0, -2)来电确实是错误的。

这意味着org/hibernate/validator/util/Version.class在某种程度上不属于pathToThisClass的一部分。我没有完整的解释,但这必须与你使用One-Jar的事实有关。

你能运行上面的测试类并用输出更新你的问题吗?

答案 1 :(得分:0)

因此,当您使用One-JAR时,问题可能在于One-JAR和Hibernate Validator之间的不兼容性。但是,在最新版本的One-JAR(0.97)中,它工作正常,因此使用最新版本。