5

우리는 하이버 네이트 검사기를 사용하고 우리의 프로젝트에서 (클래스 클래스를 별도의 클래스 로더에) 동적으로 클래스 로딩한다. 클래스가 필요 없다는 것을 알게되면 클래스와 클래스 로더에 대한 모든 참조를 제거하고 GC는이를 수집합니다.자바 8 리플렉션이 작동하지 않는다

우리가 얻는 것 : 응용 프로그램이 시작된 후 얼마 지나지 않아 자바 리플렉션이 작동을 멈 춥니 다.

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입니다

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에서 방법)이 장소에서 발생합니다. 메서드의 이름이 interned되지 않기 때문에 비교는 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와 t에 대해 s.equals (t)가 참인 경우에만 s.intern() == t.intern()이 참이됩니다. – Kaushal

+0

클래스 로더가 상위 클래스 로더 로딩을 지연 또는 위임합니까? – diginoise

+0

왜 '=='대신에 equals를 사용하지 않는가? 내 관점에서 줄을 표시 할 수 있습니다. 문자열 인턴은 this로 연결되지 않습니다. – CoronA

답변

1

st에서 acktrace, HV 5.x를 사용하고있는 것 같습니다. 내가 맞습니까?

이 문제는 프록시가 있다는 사실과 관련이있는 것으로 보입니다. 필자는 이것이 주석의 일부인 키와 관련 있다고 생각합니다.

HV 6.0.7을 사용해 볼 수 있습니까? 최종? 여기에 캐시 키의 주석을 사용하지 않아 문제가 해결 될 수 있습니다.

우리는 groupId를 변경했습니다 : org.hibernate.validator가 org.hibernate 대신에 변경되었습니다. - HV 종속성이 다른 이슈로부터 일시적으로 오는 경우주의해야하고, 필요하다면 제외를 추가하십시오. 이클립스의 종속성 계층 구조보기 - 그래서에만이 일을해야

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

(의존성의 다른 javax.el 아티팩트가있을 수 있습니다주의 :

는 또한 javax.el 의존성이 필요 도 도움이 될 것입니다)

당신은 또한 validation-api 2.0.1.Final이 필요합니다 (이것은 HV와 일시적으로 발생하지만 명시 적으로 선언 한 경우 버전을 변경해야 할 수도 있음).

이외에는 호환성 문제가 없어야합니다 (값 처리와 같은 시험용 기능을 사용하는 경우는 예외). 교체가 필요하지 않습니다. HV 6도 상당히 빨라서 윈 - 윈 상황이어야합니다.

여기에서 업그레이드와 관련된 문제를 언제든지 신고 해 주시면 도와 드리겠습니다.

+0

Guillaume Smet, 고마워요. 그러나 앱은 모두 똑같이 실패하고 있습니다. @ aleksey - shipilev pls 도와주세요! – Inv3r

관련 문제