5

Używamy walidatora hibernacji i dynamicznie ładujemy klasy w naszym projekcie (wg klasy obciążenia do oddzielnego programu ładującego klasy). Gdy zdamy sobie sprawę, że klasa nie jest wymagana, usuwamy wszystkie odwołania do klasy i modułu ładującego klasy, a następnie GC zbiera to.Odbicie java 8 nie działa

Co otrzymujemy: Czas po uruchomieniu aplikacji odbicie Javy przestaje działać.

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 

Błąd dzieje się w tym miejscu (metoda z 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)); 
} 

klasa ma metodę, ale porównanie m.getName() == internedName jest fałszywe. Porównanie zwraca wartość false, ponieważ nazwy metod nie są internowane.

Jeśli wywołuję m.getName(). Intern() == internedName z debugowania, zwraca true. Ale metoda "searchMethods" pochodzi z "java.lang.Class".

To zawsze dzieje się po pewnym czasie od rozpoczęcia aplikacji.

Czy ktoś napotkał taki problem?

EDIT (25/12/2017):

Nie tylko hibernacji walidator nie powiodła się, xml parsing zawiodły też! Przykładem

XML: Przykład

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

Mapowanie:

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

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

Przetwarzanie wyjątek:

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) 

Ale mapowanie jest poprawny i działa, jeżeli odbicie działa ...

+0

Czy wypróbowałeś m.getName(). Intern() == internedName? Z dokumentacji: Gdy wywoływana jest metoda intern, jeśli pula zawiera już łańcuch równy temu obiektowi String określonemu przez metodę equals (Object), zwracany jest ciąg z puli. W przeciwnym razie ten obiekt String zostanie dodany do puli i zwrócone zostanie odwołanie do tego obiektu String. Wynika z tego, że dla dowolnych dwóch ciągów s i t, s.intern() == t.intern() jest prawdziwe wtedy i tylko wtedy, gdy s.equals (t) jest prawdziwe. – Kaushal

+0

Czy moduł ładujący klasy odracza/deleguje ładowanie do nadrzędnego programu ładującego klasy? – diginoise

+0

Dlaczego nie używać równań zamiast '=='. Czy możesz oznaczyć linię wyjątkiem NullpointerException, z mojego punktu widzenia interakcja łańcuchowa nie doprowadzi do tego – CoronA

Odpowiedz

1

Od st acktrace, podejrzewam, że używasz HV 5.x. Czy mam rację?

Problem wydaje się być związany z faktem, że masz pełnomocnika. Myślę, że jest to prawdopodobnie związane z adnotacją będącą częścią klucza.

Czy możesz spróbować HV 6.0.7.Final? Pozbyliśmy się adnotacji w kluczu pamięci podręcznej, aby rozwiązać Twój problem.

Uważaj, zmieniliśmy groupId: teraz jest to org.hibernate.validator (zamiast org.hibernate) - zachowaj ostrożność, jeśli zależność WN przychodzi przechodnie z innego artefaktu, dodaj wykluczenia, jeśli zajdzie taka potrzeba.

Trzeba również zależność javax.el:

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

(uważaj, mogą istnieć inne artefakty javax.el w swoich zależnościach więc być pewny, że tylko ten jeden - widok hierarchii zależność Eclipse może pomóc)

Potrzebujesz również zatwierdzenia-api 2.0.1.Final (przechodzi tranzytowo z HV, ale być może będziesz musiał zmienić wersję, jeśli ją jawnie zadeklarowałeś).

Poza tym, nie powinieneś mieć problemu ze zgodnością (z wyjątkiem sytuacji, w których korzystasz z funkcji eksperymentalnych, takich jak obsługa wartości): to kropla zamiennika. HV 6 jest również znacznie szybszy, więc powinna być korzystna dla wszystkich.

Możesz zgłaszać wszelkie problemy związane z uaktualnieniem tutaj, pomogę.

+0

Guillaume Smet, dzięki, działa. Ale aplikacja nie działa tak samo. @ aleksey-shipilev pls help! – Inv3r