5

Chúng tôi sử dụng trình xác thực hibernate và tự động nạp lớp trong dự án của chúng tôi (bằng cách tải lớp vào trình nạp lớp riêng biệt). Sau khi chúng tôi nhận ra rằng lớp không bắt buộc, chúng tôi xóa tất cả các tham chiếu đến lớp và trình nạp lớp, sau đó GC thu thập thông tin này.phản chiếu java 8 không hoạt động

Những gì chúng tôi nhận được: Một thời gian sau khi ứng dụng bắt đầu phản chiếu java ngừng hoạt động.

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 

Lỗi xảy ra ở nơi này (phương pháp từ 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)); 
} 

Class trở thành phương pháp, nhưng việc so sánh m.getName() == internedName là sai. Trả về so sánh sai vì tên của các phương thức không được thực hiện.

Nếu tôi gọi m.getName(). Intern() == internedName từ gỡ lỗi, nó sẽ trả về true. Nhưng phương thức 'searchMethods' là từ 'java.lang.Class'.

Điều này luôn xảy ra sau một thời gian từ khi bắt đầu ứng dụng.

Có ai gặp phải vấn đề như vậy không?

EDIT (25/12/2017):

Không chỉ ngủ đông validator thất bại, xml phân tích thất bại quá! Ví dụ

XML:

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

Mapping dụ:

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

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

Phân tích ngoại lệ:

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) 

Nhưng bản đồ là đúng và làm việc, nếu phản ánh đang làm việc ...

+0

Bạn đã thử m.getName(). Intern() == internedName? Từ tài liệu: Khi phương thức intern được gọi, nếu pool đã chứa một chuỗi bằng đối tượng String này được xác định bằng phương thức equals (Object), thì chuỗi từ pool được trả về. Nếu không, đối tượng String này được thêm vào pool và tham chiếu đến đối tượng String này được trả về. Sau đó, cho bất kỳ hai chuỗi s và t, s.intern() == t.intern() là đúng nếu và chỉ khi s.equals (t) là đúng. – Kaushal

+0

Trình nạp lớp của bạn có trì hoãn/ủy nhiệm tải lên trình nạp lớp cha không? – diginoise

+0

Tại sao không sử dụng bằng thay cho '=='. Bạn có thể đánh dấu các dòng với NullpointerException, từ quan điểm của tôi Xem chuỗi interning sẽ không dẫn đến điều này – CoronA

Trả lời

1

Từ đầu acktrace, tôi nghi ngờ bạn đang sử dụng HV 5.x. Tôi có đúng không?

Sự cố có vẻ liên quan đến thực tế là bạn có proxy. Tôi nghĩ rằng nó có thể liên quan đến chú thích là một phần của khóa.

Bạn có thể thử HV 6.0.7.Final không? Chúng tôi đã loại bỏ việc sử dụng chú thích trong khóa bộ nhớ cache tại đây để có thể giải quyết vấn đề của bạn.

Hãy cẩn thận, chúng tôi đã thay đổi groupId: bây giờ là org.hibernate.validator (thay vì org.hibernate) - hãy cẩn thận nếu phụ thuộc HV đang chuyển động quá mức từ một tạo phẩm khác, thêm loại trừ nếu cần.

Bạn cũng cần phụ thuộc javax.el:

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

(hãy cẩn thận, có thể có hiện vật javax.el khác trong phụ thuộc của bạn vì vậy hãy chắc chắn để chỉ có một này - xem hệ thống phân cấp phụ thuộc của Eclipse có thể giúp đỡ)

Bạn cũng cần xác thực-api 2.0.1.Thực sự (nó đi kèm với quá cảnh với HV nhưng bạn có thể phải thay đổi phiên bản nếu bạn tuyên bố rõ ràng).

Ngoài ra, bạn không nên gặp phải bất kỳ vấn đề tương thích nào (trừ khi bạn đang sử dụng các tính năng thử nghiệm như xử lý giá trị): đó là một sự thay thế. HV 6 cũng nhanh hơn đáng kể nên nó phải là một tình huống có lợi.

Vui lòng báo cáo mọi sự cố với bản nâng cấp của bạn tại đây, tôi sẽ trợ giúp.

+0

Guillaume Smet, cảm ơn, nó hoạt động. Nhưng ứng dụng không giống nhau. @ aleksey-shipilev xin giúp đỡ! – Inv3r

Các vấn đề liên quan