2017-04-05 25 views
12

पर रेट्रोफिट 2 के साथ इस IllegalAccessError समस्या का कारण क्या है? किसी भी मदद की सराहना की है।java.lang.IllegalAccessError com.google.gson.Gson.newJsonWriter

मैंने पहले से ही कुछ फिक्स/वर्कअराउंड का पालन किया है और मैवेन से जीसन 2.8 का उपयोग किया है।

<dependency> 
    <groupId>com.squareup.retrofit2</groupId> 
    <artifactId>converter-gson</artifactId> 
    <version>2.2.0</version> 
    <exclusions> 
     <exclusion> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

<dependency> 
    <groupId>com.google.code.gson</groupId> 
    <artifactId>gson</artifactId> 
    <version>2.8.0</version> 
</dependency> 

और पूर्ण स्टैक ट्रेस: ​​

java.lang.IllegalAccessError: tried to access method com.google.gson.Gson.newJsonWriter(Ljava/io/Writer;)Lcom/google/gson/stream/JsonWriter; from class retrofit2.converter.gson.GsonRequestBodyConverter 
    at retrofit2.converter.gson.GsonRequestBodyConverter.convert(GsonRequestBodyConverter.java:45) 
    at retrofit2.converter.gson.GsonRequestBodyConverter.convert(GsonRequestBodyConverter.java:30) 
    at retrofit2.ParameterHandler$Body.apply(ParameterHandler.java:312) 
    at retrofit2.ServiceMethod.toRequest(ServiceMethod.java:110) 
    at retrofit2.OkHttpCall.createRawCall(OkHttpCall.java:178) 
    at retrofit2.OkHttpCall.execute(OkHttpCall.java:162) 
    at com.xxxxxx.web.controller.UserController.exchangeAccessToken(UserController.java:2551) 
    at com.xxxxxx.web.controller.UserController.plaidtoken(UserController.java:2645) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
+0

आपको निर्भरताओं के साथ कुछ गलत लगता है। 'GsonRequestBodyConverter.java: 45' मेरे लिए काम करता है अगर मैं इसे कम से कम "वेनिला" जावा प्रोग्राम से चलाता हूं (और कोई प्रतिबिंब सामग्री नहीं है, तो शायद बाइनरी असंगतता हो)। वैसे, क्या आप [स्प्रिंग रीस्ट टेम्पलेट्स] (https://spring.io/guides/gs/consuming-rest/) में माइग्रेट करने पर विचार करेंगे? यह ऐसा कुछ है जो वसंत फ्रेमवर्क ढेर को बेहतर बनाता है। या आपने रेट्रोफिट को स्प्रिंग घटक को अस्वीकार करने का विकल्प चुना था? –

+0

@LyubomyrShaydariv उत्तर के लिए धन्यवाद। रेट्रोफिट मेरी पसंद नहीं है, इसका उपयोग किसी तीसरे पक्ष के पैकेज द्वारा किया जाता है: प्लेड-जावा, जिसका हम उपयोग करते हैं। हां, मुझे पता है कि यह मुद्दा शायद कुछ निर्भरता संघर्ष के भीतर है, लेकिन चूंकि प्रोजेक्ट कई तृतीय पक्षों के libs का उपयोग करता है, क्या आप यह जानने के लिए जानते हैं कि कौन सी समस्या का कारण बनती है? – Billhatsv

+0

@LyubomyrShaydariv प्रारूपण के लिए भी धन्यवाद। – Billhatsv

उत्तर

2

यह अब हल किया जाता है यहाँ आंशिक Maven विन्यास है। यहां बताया गया है कि मैंने किसी और के लिए भी इसी तरह की समस्या की तलाश की:

मैंने 'jar -tf filename.jar' का उपयोग हमारे द्वारा उपयोग किए जाने वाले प्रत्येक पैकेज की सामग्री को सूचीबद्ध या डंप करने के लिए किया, और 'gson' के परिणाम की खोज की ।

मैं तीसरे पक्ष के पैकेज में से एक को पहचानने में सक्षम था जिसमें इसके साथ जीसन शामिल था। एक बार यह जार फ़ाइल अलग हो जाने पर, समस्या चली गई।

पढ़ने के लिए धन्यवाद।

2

IllegalAccessError प्रलेखन के अनुसार:

फेंक एक आवेदन एक क्षेत्र तक पहुँचने या संशोधित करने के लिए, या एक विधि है कि यह करने के लिए पहुँच नहीं है कॉल करने के लिए प्रयास करता है।

... इस त्रुटि केवल रन टाइम पर हो सकता है यदि एक वर्ग की परिभाषा incompatibly बदल गया है।

आपके मामले में अपवाद रनटाइम पर फेंक दिया गया है जिसका अर्थ है कि संकलन समय पर कक्षापथ रनपाइम पर कक्षापथ से अलग था।

सामान्य स्थिति में ऐसी समस्या सकर्मक निर्भरता का विश्लेषण करके हल किया जा सकता है, तो आप maven dependency plugin उपयोग कर सकते हैं:

mvn dependency:tree 

सबसे अधिक संभावना आप के साथ से gson संस्करण अलग अपने libs में से कुछ में सकर्मक निर्भरता मिल जाएगा एक जिसे आपने घोषित किया

नोट: यदि आप एक संक्रमणकारी निर्भरताओं को प्रतिस्थापित करते हैं तो कुछ और तोड़ने का हाइट मौका है। इसके साथ सावधान रहें और सुनिश्चित करें कि आप संगत libs का उपयोग कर रहे हैं।

संबंधित मुद्दे