2012-06-20 7 views
8

में प्रतिक्रिया शरीर पढ़ें। अब तक सब कुछ ठीक काम करता है।अपने Android एप्लिकेशन में सभी बाकी अनुरोध/RestTemplate वस्तु के लिए प्रतिक्रियाओं लॉग इन करने के लिए एक सरल स्प्रिंग इंटरसेप्टर वर्ग का उपयोग कर रहा एक Android स्प्रिंग इंटरसेप्टर

public class LoggerInterceptor implements ClientHttpRequestInterceptor { 

@Override 
public ClientHttpResponse intercept(HttpRequest request, byte[] body, 
    ClientHttpRequestExecution execution) throws IOException { 

Log.d(TAG, "Request body: " + new String(body)); 
// ...more log statements... 

ClientHttpResponse response = execution.execute(request, body); 

Log.d(TAG, "Response Headers: " + response.getHeaders()); 

return response; 
} 

प्रारंभ में मैं फोन:

List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); 
LoggerInterceptor loggerInterceptor = new LoggerInterceptor(); 
interceptors.add(loggerInterceptor); 
restTemplate.setInterceptors(interceptors); 

हालांकि मैं ऊपर क्योंकि InputStream एक बार सेवन किया और एक IllegalStateException जब यह बाद में फिर से सेवन किया जाता है फेंकता जाता विधि में response.getBody() प्रवेश नहीं कर सकते। क्या इसके आसपास कोई रास्ता है ताकि मैं प्रतिक्रिया शरीर को भी लॉग कर सकूं?

उत्तर

11

एकाधिक response.getBody() कॉलों को अनुमति देने के लिए एक BufferingClientHttpRequestFactory में अपने ClientHttpRequestFactory को लपेटें।

ClientHttpRequestFactory requestFactory = 
    new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()); 
restTemplate.setRequestFactory(requestFactory); 
+0

3.1 वसंत ढांचे का उपयोग या बाद में, यह निश्चित रूप से एक अधिक सुरुचिपूर्ण समाधान है। – Nachi

6

ClientHttpResponse को लागू करें और setBody(byte[] body) विधि जोड़ें और getBody ओवरराइड करें। उपरोक्त कोड में, आप बाइट सरणी को ByteArrayInputStream में संग्रहीत कर सकते हैं, जो चाहते हैं उसे लॉग करें, फिर अपनी कक्षा के उदाहरण में बाइट सरणी को वापस सेट करें जो ClientHttpResponse लागू करता है, और फिर आप वापस लौट सकते हैं।

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