5

私たちは、hibernateバリデーターを使用して、プロジェクト(ロードクラス別のクラスローダーに)で動的にクラスローディングします。クラスが必須ではないことが分かった後、クラスとクラスローダへの参照をすべて削除し、GCはこれを収集します。java 8のリフレクションが機能しません

入手方法:アプリケーションの起動後しばらくすると、Javaのリフレクションが停止します。

java.lang.reflect.UndeclaredThrowableException: null 
    at com.sun.proxy.$Proxy253.equals(Unknown Source) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager$CacheKey.equals(ConstraintValidatorManager.java:287) 
    at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:940) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.getInitializedValidator(ConstraintValidatorManager.java:104) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorNoUnwrapping(ConstraintTree.java:301) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorInstanceForAutomaticUnwrapping(ConstraintTree.java:242) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:163) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:116) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateComposingConstraints(ConstraintTree.java:396) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:98) 
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:87) 
    at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:73) 
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:616) 
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:581) 
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement(ValidatorImpl.java:527) 
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:495) 
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:460) 
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:410) 
    at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:207) 
    at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:281) 
    ... Many spring filters calls ... 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
    at org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:122) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
    at *someAwesomePackage*.microservice.rest.spring.webapp.CabinetRequestFilter.doFilterInternal(CabinetRequestFilter.java:98) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:748) 
Caused by: java.lang.reflect.InvocationTargetException: null 
    at sun.reflect.GeneratedMethodAccessor268.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.hibernate.validator.internal.util.annotationfactory.AnnotationProxy.invoke(AnnotationProxy.java:69) 
    ... 260 common frames omitted 
Caused by: java.lang.NullPointerException: null 
    at org.hibernate.validator.internal.util.annotationfactory.AnnotationProxy.getAnnotationMemberValue(AnnotationProxy.java:248) 
    at org.hibernate.validator.internal.util.annotationfactory.AnnotationProxy.equals(AnnotationProxy.java:104) 
    ... 264 common frames omitted 

エラーは、この場所(java.lang.Class.javaから法)で行わ:

private static Method searchMethods(Method[] methods, 
            String name, 
            Class<?>[] parameterTypes) { 
    Method res = null; 
    String internedName = name.intern(); 
    for (int i = 0; i < methods.length; i++) { 
     Method m = methods[i]; 
     if (m.getName() == internedName 
      && arrayContentsEq(parameterTypes, m.getParameterTypes()) 
      && (res == null 
       || res.getReturnType().isAssignableFrom(m.getReturnType()))) 
      res = m; 
    } 
    return (res == null ? res : getReflectionFactory().copyMethod(res)); 
} 

クラスメソッドを持っていますが、m.getName() == internedNameの比較はfalseです。 メソッドの名前がインターンされていないため、比較はfalseを返します。

m.getName(). Intern() == internedNameをデバッグから呼び出すと、trueを返します。しかし、 'searchMethods'メソッドは 'java.lang.Class'からのものです。

これは、アプリケーションが開始されてからしばらく時間が経過すると常に発生します。

誰もこのような問題に遭遇しましたか?

EDIT(25/12/2017):

だけでなく、バ​​リデータが失敗した休止状態、XMLの解析には、あまりにも失敗しました!

XMLの例:

<SELFCARE> 
    <SESSION_ID>***</SESSION_ID> 
</SELFCARE> 

マッピング例:

@XmlRootElement(name = "SELFCARE") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Session { 

    @XmlElement(name = "SESSION_ID") 
    private String sessionId; 
} 

解析例外:

WARN 2017.12.25 20:00:05.991 +0300 org.apache.cxf.jaxrs.provider.AbstractJAXBProvider    javax.xml.bind.UnmarshalException 
- with linked exception: 
[com.sun.istack.SAXParseException2; lineNumber: 1; columnNumber: 1; unexpected element (uri:"", local:"SELFCARE"). Expected elements are <{}SELFCARE>] 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:483) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:417) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:386) 
    at org.apache.cxf.jaxrs.provider.JAXBElementProvider.unmarshalFromInputStream(JAXBElementProvider.java:294) 
    at org.apache.cxf.jaxrs.provider.JAXBElementProvider.doUnmarshal(JAXBElementProvider.java:245) 

しかし、反射が働いている場合、マッピングは、正しいと働いている...

+0

m.getName()を試しましたか?intern()== internedName?ドキュメントから:internメソッドが呼び出されると、プールにequals(Object)メソッドで指定されたStringオブジェクトに等しい文字列がすでに含まれている場合、プールの文字列が返されます。それ以外の場合は、このStringオブジェクトがプールに追加され、このStringオブジェクトへの参照が返されます。 s.equals(t)が真である場合に限り、s.intern()== t.intern()は真となります。 – Kaushal

+0

あなたのクラスローダは、親クラスローダへの読み込みを延期/委譲していますか? – diginoise

+0

'=='の代わりにequalsを使わないのはなぜですか?あなたの視点からNullpointerExceptionで行をマークすることはできますか?文字列インターンはこれにつながりません。 – CoronA

答えて

1

stからacktrace、HV 5.xを使用していると思われます。私は正しい?

この問題は、あなたがプロキシを持っているという事実に関連しているようです。私はそれがおそらくキーの一部である注釈に関連していると思う。

HV 6.0.7を試すことができますか?最終?ここでキャッシュキーのアノテーションを使用しなくなったため、問題が解決する可能性があります。

groupIdを変更しました。これはorg.hibernate.validator(org.hibernateではなく)です。HV依存関係が別のアーティファクトから推移してくる場合は注意し、必要に応じて除外項目を追加してください。

ます。またjavax.el依存性を必要とする:

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.el</artifactId> 
    <version>3.0.1-b08</version> 
</dependency> 

(これだけ、このいずれかを持っているようにしてくださいあなたの依存関係で他のjavax.elアーティファクトがあるかもしれない、注意が必要 - のEclipseの依存関係の階層ビュー

また、validation-api 2.0.1.Finalが必要です(これはHVで推移しますが、明示的に宣言した場合はバージョンを変更する必要があります)。

これ以外に、互換性の問題はありません(バリューハンドリングなどの実験的な機能を使用していた場合を除いて)。これは置き換えられません。 HV 6も大幅に高速化しているため、Win-Winの状況になるはずです。

ここでアップグレードに関する問題を報告してください。お手伝いします。

+0

Guillaume Smet、ありがとうございます。しかし、アプリはすべて同じように失敗しています。 @ aleksey-shipilev plsヘルプ! – Inv3r

関連する問題