2012-04-04 15 views
6

में प्रतिक्रिया एंटीटी तक पहुंच मेरे पास एक इंटरसेप्टर है जो स्प्रिंग एमवीसी प्रतिक्रियाओं के परिणाम को लॉग करता है। मेरे सभी प्रतिक्रियाएं ResponseEntity ऑब्जेक्ट्स लौटती हैं जिनमें JSON बॉडी सामग्री होती है।वसंत एमवीसी इंटरसेप्टर: पोस्टहैंडल

मैं प्रतिक्रिया प्रतिक्रिया से प्रतिक्रिया प्रतिक्रिया और http स्थिति दोनों को पकड़ना चाहता हूं।

मैं पोस्टहैंडल विधि विशेषताओं से ResponseEntity तक कैसे पहुंच सकता हूं?

public void postHandle(HttpServletRequest request, 
    HttpServletResponse response, 
    Object handler, 
    ModelAndView modelAndView) {} 

मॉडल और दृश्य विशेषता मेरे आमंत्रण के लिए शून्य है।

धन्यवाद, जेसन

उत्तर

1

मैं एक पूर्ण समाधान है, और एक आंशिक समाधान मिल गया है।

आंशिक समाधान: Servlet 3.0 का उपयोग करने वाले लोगों के लिए, HTTPStatus कोड HttpServletResponse ऑब्जेक्ट पर उपलब्ध है। इससे मेरी समस्या का आधा हल हो गया था कि मुझे स्टेटस कोड मिल सकता है, लेकिन यह अभी भी मुझे ResponseEntity तक पहुंच नहीं देता है जिसमें शरीर की विशेषता है जिसे मैं निरीक्षण करना चाहता हूं।

पूर्ण समाधान (सर्वलेट 2.x पर काम करता है): मैंने एक पहलू और एक इंटरसेप्टर का संयोजन किया।

पहलू को नियंत्रक के तरीकों के @AfterReturn को लक्षित करने के लिए कोड किया गया था जो ResponseEntities को वापस करता है। यह मूल रूप से लौटाए गए प्रतिक्रिया एंटीटी पर कब्जा कर लिया और इसे थ्रेडलोकल <ResponseEntity> संग्रह में डाल दिया।

इंटरसेप्टर ने तब थ्रेड की प्रतिक्रिया के लिए पहलू से पूछा और टीए-डीएएच यह सुलभ था।

मुझे आशा है कि यह उत्तर किसी और की मदद करेगा। चीयर्स, जेसन

+0

मैंने इसे जेसन का उपयोग करके हल किया। [Https://stackoverflow.com/questions/26756811/post-processing-of-a-json-response-in-spring-mvc] – Lucas

2

जब तक आपने अपना प्रश्न लिखा था, मुझे लगता है कि यह संभव नहीं था लेकिन अब यह है। उनके डॉक्स से http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-intercepto

"ध्यान दें कि HandlerInterceptor की postHandle विधि हमेशा आदर्श @ResponseBody और ResponseEntity तरीकों के साथ प्रयोग के लिए अनुकूल नहीं है। ऐसे मामलों में एक HttpMessageConverter लिए लिखते हैं और प्रतिक्रिया है जो यह असंभव बना देता है से पहले postHandle कहा जाता है करता है । कोई ऐसा शीर्ष लेख के लिए उदाहरण के लिए, जवाब बदलने की बजाय एक आवेदन ResponseBodyAdvice लागू कर सकते हैं और या तो एक @ControllerAdvice सेम के रूप में यह घोषणा करते हैं या उसे सीधे कॉन्फ़िगर RequestMappingHandlerAdapter "

0
@ControllerAdvice 
public class ResponseDTOFilterAdvice implements ResponseBodyAdvice<Object> { 
    @Override 
    public boolean supports(final MethodParameter returnType, final Class<? extends HttpMessageConverter<?>> converterType) { 
     return true; 
    } 

    @Override 
    public Object beforeBodyWrite(final Object body, final MethodParameter returnType, final MediaType selectedContentType, 
     final Class<? extends HttpMessageConverter<?>> selectedConverterType, final ServerHttpRequest request, 
     final ServerHttpResponse response) { 
     if (body instanceof ResponseDTO<?>) { 
      ResponseDTO<?> responseDTO = (ResponseDTO<?>) body; 
      responseDTO.setHostname(request.getLocalAddress().getHostName()); 
     } 
     return body; 
    } 
} 

स्रोत पर: Post processing of a Json response in spring MVC

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