2017-10-06 108 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 )。