2017-07-25 19 views
8

अपाचे टॉमकैट 8.5 पर वसंत 4.3.1 का उपयोग करते हुए संसाधन AccessException बनाम HttpClientErrorException को फेंकना, हमने एक आरईएसटी सर्वर लागू किया है जो GET, POST & PUT अनुरोधों को प्रबंधित करता है। पोस्ट अनुरोध के रूप में नियंत्रित किया जाता है:स्प्रिंग

@POST 
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
@Transactional 
public Response postMethod(final MyDomain object) { 
    domainHandler.createDomain(object); 
    return Response.status(201).entity(object).build(); 
} 

सर्वर साइड पर पोस्ट अनुरोध से निपटने के दौरान, WebApplicationException फेंक दिया जाता है, जिसके द्वारा नियंत्रित किया जाता है:

@Provider 
public class WebExceptionMapper implements ExceptionMapper<WebApplicationException> { 
    @Override 
    public Response toResponse(WebApplicationException exception) { 
      int httpStatus = exception.getResponse().getStatus(); 
      ErrorMessage em = new WebErrorMessage(exception.getMessage()); 
      return Response.status(httpStatus).entity(em).build(); 
    } 
} 

ग्राहक के पक्ष में:

response = rest.exchange(requestURL, method, requestEntity, MyDomain.class); 

ResourceAccessException फेंक दिया जाता है:

2017-07-25 15:46:41,489 ERROR [com.my.code.web.presentation.ManagementController:63] (http-nio-8080-exec-7#34): Internal exception occured with cause: 
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:8080/": Server returned HTTP response code: 500 for URL: http://localhost:8080/; nested exception is java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8080/ 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:633) ~[spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580) ~[spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:498) ~[spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at com.my.code.web.integration.client.rest.FeedbackRestClient.callForApiCreateFeedback(FeedbackRestClient.java:218) ~[classes/:?] 
    at com.my.code.web.integration.client.rest.FeedbackRestClient.pushFeedbackData(FeedbackRestClient.java:70) ~[classes/:?] 
    at com.my.code.web.presentation.FeedbackController.feedback(FeedbackController.java:91) ~[classes/:?] 
    at sun.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[?:?] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131] 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) ~[spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) ~[spring-webmvc-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) [spring-webmvc-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) [spring-webmvc-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) [servlet-api.jar:?] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [servlet-api.jar:?] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.16] 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.16] 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.16] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [catalina.jar:8.5.16] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:8.5.16] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [catalina.jar:8.5.16] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [catalina.jar:8.5.16] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [catalina.jar:8.5.16] 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624) [catalina.jar:8.5.16] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [catalina.jar:8.5.16] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [catalina.jar:8.5.16] 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-coyote.jar:8.5.16] 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:8.5.16] 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-coyote.jar:8.5.16] 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-coyote.jar:8.5.16] 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:8.5.16] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_131] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_131] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.5.16] 
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131] 
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: http://localhost:8080/ 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1876) ~[?:1.8.0_131] 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474) ~[?:1.8.0_131] 
    at org.springframework.http.client.SimpleClientHttpResponse.getBody(SimpleClientHttpResponse.java:85) ~[spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at com.my.code.web.integration.client.rest.BufferingClientHttpResponseWrapper.getBody(BufferingClientHttpResponseWrapper.java:46) ~[classes/:?] 
    at com.my.code.web.integration.client.rest.LoggingRequestInterceptor.traceResponse(LoggingRequestInterceptor.java:66) ~[classes/:?] 
    at com.my.code.web.integration.client.rest.LoggingRequestInterceptor.intercept(LoggingRequestInterceptor.java:34) ~[classes/:?] 
    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:85) ~[spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:69) ~[spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) ~[spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:619) ~[spring-web-4.3.1.RELEASE.jar:4.3.1.RELEASE] 
    ... 47 more 

प्रश्न:

क्यों अपवाद org.springframework.web.client.ResourceAccessException फेंक दिया जाता है, लेकिन नहीं org.springframework.web.client.HttpClientErrorException, GET अनुरोध से निपटने जब WebApplicationException होता है के लिए क्या हो रहा है?

ResourceAccessException अपवाद तरीकों कि मुझे HTTP स्थिति को पढ़ने के लिए अनुमति देते हैं, नहीं है जैसे getRawStatusCode(), getResponseHeaders(), आदि

+0

आपके द्वारा पोस्ट किए गए सभी अपवाद ट्रेस क्लाइंट साइड हैं। एपीआई 500 फेंक रहा है और शेष अपवाद मैपिंग क्लाइंट संदर्भ में होता है। क्या आप सर्वर पक्ष में कुछ अतिरिक्त लॉगिंग जोड़ने का प्रयास कर सकते हैं - WebExceptionMapper को सत्यापित करने के लिए कि कोड ब्लॉक निष्पादित हो रहा है या नहीं? –

+0

Somethings वास्तव में आपके stacktrace के साथ अजीब: "आंतरिक अपवाद कारण के साथ हुआ: [...] सर्वर HTTP प्रतिक्रिया कोड लौटा: यूआरएल के लिए 500" कैच किए गए एक में "IOException: सर्वर HTTP प्रतिक्रिया कोड लौटा: URL के लिए 400 [.. ।] "कारण में। क्या यह वास्तव में आपका स्टैकट्रैक है या आपने गलत कॉपी/पेस्ट किया है? –

+0

आपका एक्साेंज यूआरएल "http: // localhost: 8080 /" है और आपके @POST अनुरोध स्वीकार करने के तरीके में यह परिभाषित नहीं किया गया है कि यह डिफ़ॉल्ट अनुरोध स्वीकार्य है जैसे @RequestMapping (value = "/", method = RequestMethod.POST) –

उत्तर

1

क्योंकि यह एक IOException लपेटकर है, वास्तविक प्रतिक्रिया कोड पर नहीं लग रही।

मूल कारण ऐसा प्रतीत होता है क्योंकि BufferingClientHttpResponseWrapper बिना किसी जांच के एक शरीर को पढ़ने की कोशिश कर रहा है।

+0

है httpStatus और प्रतिक्रिया बॉडी पाने के लिए कोई रास्ता है? – gstackoverflow

+0

@gstackoverflow आपका क्या मतलब है? ओपी ने लिखा एक वर्ग, 'बफरिंग क्लाइंट एचटीपी रेस्पॉन्सप्रैपर' में एक बग है। – OrangeDog

+1

@gstackoverflow आपको अपने वास्तविक प्रश्न पर एक बक्षीस देना चाहिए था। जबकि मैं खुशी से अपना 100 ले जाऊंगा, यह सवाल पूरी तरह से असंबंधित है। – OrangeDog