2017-10-06 156 views
2

当包含在WAR文件部署中的JodaTime v.2.5库在GF 5.0中失败并出现以下错误时。看起来问题在于hibernate-validator。 FutureValidatorForReadableInstant未加载,因为在GF 4.1.2中,ReadableInstant在GF5.0中未由hibernate-validator软件包加载。当WAR文件部署中包含JodaTime v.2.5库时

异常而加载的应用程序:CDI部署失败: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$3$1.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 
+0

在hibernate-validator 6.0.2.Final中,如果joda jar在web应用程序中可用,它将“FutureValidatorForReadableInstant”添加到验证程序列表中,请参阅https://github.com/hibernate/hibernate-validator/blob/6.0.2。最后/发动机/ src目录/主/ JAVA /组织/休眠/识别/内部/元/核心/ ConstraintHelper.java#L367 – anjava

回答

1

我想可能是在Hibernate验证的错误。我创建了https://hibernate.atlassian.net/browse/HV-1490来跟踪这个问题。

当我们尝试在ConstraintHelper中检测Joda时间时,我们使用LoadClass机制,如果它在ConstraintHelper/HV CL中未找到类,可能会回退到使用线程上下文类加载器。

就你而言,我认为ReadableInstant类可以在TCCL中访问,但不能在HV CL中访问。

当我们试图从ConstraintValidator获取类型时,我们只有HV CL,因此它无法找到类。

所以我认为我们应该在HV中解决这个问题,但我不确定它会帮助您,因为一旦修复,Joda Time约束验证器将无法启用。

有什么可能没有帮助的是,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中的罐子。如上所述,它不会允许您对Joda Time类型使用约束,但至少应该能够启动您的应用程序。如果您可以尝试,我对您的反馈感兴趣。

关于GF部分,我通过电子邮件向GF团队发送电子邮件,并会告知您是否在这方面取得了一些进展。

更新:GF 5.0.1将包含此问题的修复。如果您将当前的GF升级到HV 6.0.3.Final,我们今天发布,您应该可以启动您的应用程序(但无法对Joda Time类型设置约束条件,因此必须等待GF 5.0.1 )。