Java bean验证-休眠错误

Java bean验证-休眠错误,java,hibernate,spring,validation,Java,Hibernate,Spring,Validation,尝试运行命令行应用程序时出现以下异常: java.lang.ExceptionInInitializerError at org.hibernate.validator.engine.ConfigurationImpl.<clinit>(ConfigurationImpl.java:52) at org.hibernate.validator.HibernateValidator.createGenericConfiguration(Hibernate

尝试运行命令行应用程序时出现以下异常:

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
java.lang.ExceptionInInitializeError
位于org.hibernate.validator.engine.configurationmpl.(configurationmpl.java:52)
位于org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:43)
位于javax.validation.validation$GenericBootstrapImpl.configure(validation.java:269)
原因:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-2
位于java.lang.String.substring(String.java:1937)
位于org.hibernate.validator.util.Version.(Version.java:39)
... 34多

我做错什么了吗?请建议

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

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

这很奇怪。我将
o.h.v.u.Version
static
初始化块的相关部分粘贴到一个带有
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索引超出范围:-2
表明:

pathToThisClass.indexOf( classFilePath )
正在返回
-1
,使得该类的
路径。子字符串(0,-2)
调用确实错误

这意味着,
org/hibernate/validator/util/Version.class
在某种程度上不是您得到的类的
路径的一部分。我没有一个完整的解释,但这必须与您使用一个罐子的事实有关


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

这很奇怪。我将
o.h.v.u.Version
static
初始化块的相关部分粘贴到一个带有
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索引超出范围:-2
表明:

pathToThisClass.indexOf( classFilePath )
正在返回
-1
,使得该类的
路径。子字符串(0,-2)
调用确实错误

这意味着,
org/hibernate/validator/util/Version.class
在某种程度上不是您得到的类的
路径的一部分。我没有一个完整的解释,但这必须与您使用一个罐子的事实有关


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

我们应该在没有看到任何源代码的情况下诊断这个问题吗?我正在尝试向上插入item managerService.save(item,tokenId);在业务层公共项validateItem(最终项项项){try{final ValidatorFactory=Validation.byDefaultProvider().configure().traversableResolver(新的CustomTraversableResolver()).buildValidatorFactory();validator=factory.getValidator();}catch(最终可丢弃的e){e.printStackTrace();System.exit(0);}当我在eclipse上运行应用程序时,我可以取消插入,问题是当我通过JAR作为命令行应用程序运行时,考虑到异常的原因()。您使用哪个操作系统和JRE,Hibernate验证器的jar放在哪里,如何将其放入类路径中?我使用jdk 1.6,windows操作系统,我使用一个jar生成jar文件,下面是结构一个jar-lib(所有验证jar,business.jar)-main.jar(我有这个方法,它具有调用我的服务层的事务属性)我想问题出在org.hibernate.validator.util.Version类字符串pathToThisClass=38 clazz.getResource(classFileName).toString();39字符串pathToManifest=pathToThisClass.substring(0,pathToThisClass.indexOf(classFilePath))中的下面两行-1)40+“/META-INF/MANIFEST.MF”;当我生成jar文件时,clazz.getResource(classFileName).toString()返回null,因此引发异常。有什么方法可以避免这种情况吗?我们应该在没有看到任何源代码的情况下诊断这种情况吗?我正在尝试升级item managerService.save(item,tokenId);在业务层公共项validateItem(最终项项项)中获取异常{try{final ValidatorFactory=Validation.byDefaultProvider().configure().traversableResolver(新的CustomTraversableResolver()).buildValidatorFactory();validator=factory.getValidator();}catch(最终可丢弃的e){e.printStackTrace();System.exit(0);}当我在eclipse上运行应用程序时,我可以取消插入,问题是当我通过JAR作为命令行应用程序运行时,考虑到异常的原因()。您使用哪个操作系统和JRE,Hibernate验证器的jar放在哪里,如何将其放入类路径中?我使用jdk 1.6,windows操作系统,我使用一个jar生成jar文件,下面是结构一个jar-lib(所有验证jar,business.jar)-main.jar(我有这个方法,它具有调用我的服务层的事务属性)我想问题出在org.hibernate.validator.util.Version类字符串pathToThisClass=38 clazz.getResource(classFileName).toString();39字符串pathToManifest=pathToThisClass.substring(0,pathToThisClass.indexOf(classFilePath))中的下面两行-1)40+“/META-INF/MANIFEST.MF”,因为我正在生成一个jar文件clazz.getResource(classFileName.toString())正在返回null,因此引发异常。是否有任何方法可以避免这种情况?在使用最新的one jar版本时获取各种异常,在无效xml上获取非法参数异常(尽管存在有效的xml),在尝试重新生成