当包含在 WAR 文件中的 JodaTime v.2.5 库部署失败
When JodaTime v. 2.5 library included into WAR file deployment fails
当 JodaTime v.2.5 库包含在 WAR 文件中时,在 GF 5.0 中部署失败并出现以下错误。看来问题出在休眠验证器上。 FutureValidatorForReadableInstant 未加载,因为 ReadableInstant 在运行 GF 4.1.2 时未被 GF5.0 中的休眠验证程序包加载。
加载应用程序时出现异常:CDI 部署failure:Errornstantiating:org.hibernate.validator.cdi.internal.ValidationExtension
Caused by: java.lang.TypeNotPresentException: Type org.joda.time.ReadableInstant not present
at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117)
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125)
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
at sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68)
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:138)
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
at sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:90)
at java.lang.Class.getGenericSuperclass(Class.java:777)
at org.hibernate.validator.internal.util.TypeHelper.resolveTypeForClassAndHierarchy(TypeHelper.java:386)
at org.hibernate.validator.internal.util.TypeHelper.resolveTypes(TypeHelper.java:351)
at org.hibernate.validator.internal.util.TypeHelper.extractType(TypeHelper.java:327)
at org.hibernate.validator.internal.engine.constraintvalidation.ClassBasedValidatorDescriptor.(ClassBasedValidatorDescriptor.java:39)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorDescriptor.forClass(ConstraintValidatorDescriptor.java:49)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at org.hibernate.validator.internal.metadata.core.ConstraintHelper.putConstraints(ConstraintHelper.java:686)
at org.hibernate.validator.internal.metadata.core.ConstraintHelper.(ConstraintHelper.java:386)
at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.(ValidatorFactoryImpl.java:155)
at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:322)
at org.hibernate.validator.cdi.internal.ValidationExtension.(ValidationExtension.java:116)
... 78 more
我认为这可能是 Hibernate Validator 中的错误。我创建了 https://hibernate.atlassian.net/browse/HV-1490 来跟踪这个问题。
当我们尝试在 ConstraintHelper 中检测 Joda Time 时,我们使用 LoadClass 机制,如果它在 ConstraintHelper/HV CL.
在你的情况下,我认为 ReadableInstant class 可以在 TCCL 中访问,但不能在 HV CL 中访问。
当我们尝试从 ConstraintValidator 获取类型时,我们只有 HV CL,因此无法找到 class。
所以我认为我们应该在 HV 中修复它,但我不确定它是否会对您有所帮助,因为一旦修复,Joda 时间约束验证器将无论如何都不会启用。
可能无济于事的是,HV 的 OSGi 包在 Joda 时间依赖性方面看起来有点过时 (https://github.com/javaee/glassfish/blob/master/nucleus/packager/external/bean-validator/pom.xml#L124)。我会与 GlassFish 团队联系,看看他们是否可以更新它。
我创建了一个 PR https://github.com/hibernate/hibernate-validator/pull/857 来解决我们这边的问题。您可能能够获取此分支,构建它(这只是一个 mvn 全新安装)并升级 GlassFish 中的 jars。如上所述,它不允许您对 Joda Time 类型使用约束,但至少,您应该能够启动您的应用程序。如果您可以尝试一下,我对您的反馈很感兴趣。
关于 GF 部分,我给 GF 团队发了邮件,如果这方面有一些进展,我会通知你。
更新:GF 5.0.1 将包含针对此问题的修复程序。如果您将当前的 GF 升级到我们今天发布的 HV 6.0.3.Final,您应该能够启动您的应用程序(但不能对 Joda Time 类型施加限制,这必须等待 GF 5.0 .1).
当 JodaTime v.2.5 库包含在 WAR 文件中时,在 GF 5.0 中部署失败并出现以下错误。看来问题出在休眠验证器上。 FutureValidatorForReadableInstant 未加载,因为 ReadableInstant 在运行 GF 4.1.2 时未被 GF5.0 中的休眠验证程序包加载。
加载应用程序时出现异常:CDI 部署failure:Errornstantiating:org.hibernate.validator.cdi.internal.ValidationExtension
Caused by: java.lang.TypeNotPresentException: Type org.joda.time.ReadableInstant not present
at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117)
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125)
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
at sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68)
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:138)
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
at sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:90)
at java.lang.Class.getGenericSuperclass(Class.java:777)
at org.hibernate.validator.internal.util.TypeHelper.resolveTypeForClassAndHierarchy(TypeHelper.java:386)
at org.hibernate.validator.internal.util.TypeHelper.resolveTypes(TypeHelper.java:351)
at org.hibernate.validator.internal.util.TypeHelper.extractType(TypeHelper.java:327)
at org.hibernate.validator.internal.engine.constraintvalidation.ClassBasedValidatorDescriptor.(ClassBasedValidatorDescriptor.java:39)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorDescriptor.forClass(ConstraintValidatorDescriptor.java:49)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at org.hibernate.validator.internal.metadata.core.ConstraintHelper.putConstraints(ConstraintHelper.java:686)
at org.hibernate.validator.internal.metadata.core.ConstraintHelper.(ConstraintHelper.java:386)
at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.(ValidatorFactoryImpl.java:155)
at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:322)
at org.hibernate.validator.cdi.internal.ValidationExtension.(ValidationExtension.java:116)
... 78 more
我认为这可能是 Hibernate Validator 中的错误。我创建了 https://hibernate.atlassian.net/browse/HV-1490 来跟踪这个问题。
当我们尝试在 ConstraintHelper 中检测 Joda Time 时,我们使用 LoadClass 机制,如果它在 ConstraintHelper/HV CL.
在你的情况下,我认为 ReadableInstant class 可以在 TCCL 中访问,但不能在 HV CL 中访问。
当我们尝试从 ConstraintValidator 获取类型时,我们只有 HV CL,因此无法找到 class。
所以我认为我们应该在 HV 中修复它,但我不确定它是否会对您有所帮助,因为一旦修复,Joda 时间约束验证器将无论如何都不会启用。
可能无济于事的是,HV 的 OSGi 包在 Joda 时间依赖性方面看起来有点过时 (https://github.com/javaee/glassfish/blob/master/nucleus/packager/external/bean-validator/pom.xml#L124)。我会与 GlassFish 团队联系,看看他们是否可以更新它。
我创建了一个 PR https://github.com/hibernate/hibernate-validator/pull/857 来解决我们这边的问题。您可能能够获取此分支,构建它(这只是一个 mvn 全新安装)并升级 GlassFish 中的 jars。如上所述,它不允许您对 Joda Time 类型使用约束,但至少,您应该能够启动您的应用程序。如果您可以尝试一下,我对您的反馈很感兴趣。
关于 GF 部分,我给 GF 团队发了邮件,如果这方面有一些进展,我会通知你。
更新:GF 5.0.1 将包含针对此问题的修复程序。如果您将当前的 GF 升级到我们今天发布的 HV 6.0.3.Final,您应该能够启动您的应用程序(但不能对 Joda Time 类型施加限制,这必须等待 GF 5.0 .1).