2012-04-04 45 views
6

Tôi có một máy đánh chặn ghi lại kết quả của các phản hồi của Spring MVC. Tất cả các phản hồi của tôi trả về các đối tượng ResponseEntity có nội dung JSON.interceptor mùa xuân mvc: truy cập vào ResponseEntity trong postHandle

Tôi muốn lấy cả nội dung phản hồi và trạng thái http từ ResponseEntity.

Tôi làm cách nào để có quyền truy cập vào ResponseEntity từ thuộc tính phương thức postHandle?

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

Thuộc tính modelAndView không có giá trị cho lời gọi của tôi.

Xin cảm ơn, Jason

Trả lời

1

Tôi đã tìm thấy một giải pháp đầy đủ và một giải pháp một phần.

Giải pháp một phần: Đối với những người đang sử dụng Servlet 3.0, Mã HTTPStatus có sẵn trên đối tượng HttpServletResponse. Điều này sẽ giải quyết được một nửa vấn đề của tôi ở chỗ tôi có thể lấy mã trạng thái, nhưng nó vẫn không cho tôi truy cập vào ResponseEntity có thuộc tính cơ thể mà tôi muốn kiểm tra.

Giải pháp đầy đủ (hoạt động trên Servlet 2.x): Tôi đã sử dụng kết hợp Aspect và Interceptor.

Aspect được mã hóa để nhắm mục tiêu @AfterReturn của các phương thức của bộ điều khiển trả về ResponseEntities. Về cơ bản nó đã nắm bắt responseEntity trả về và đặt nó trong một bộ sưu tập ThreadLocal <ResponseEntity>.

Trình chặn sau đó đã yêu cầu Aspect cho phản hồi của chuỗi và TA-DAH có thể truy cập được.

Tôi hy vọng câu trả lời này sẽ giúp người khác. Chúc mừng, Jason

+0

Tôi đã giải quyết nó bằng cách sử dụng này, Jason. [https://stackoverflow.com/questions/26756811/post-processing-of-a-json-response-in-spring-mvc] – Lucas

2

Khi bạn viết câu hỏi của mình, tôi nghĩ điều đó là không thể nhưng hiện tại. Từ tài liệu của họ http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-intercepto

"Lưu ý rằng phương pháp postHandle của HandlerInterceptor không phải lúc nào cũng lý tưởng để sử dụng với phương pháp @ResponseBody và ResponseEntity. Trong trường hợp này một HttpMessageConverter ghi vào và cam kết đáp ứng trước khi postHandle được gọi mà làm cho nó không thể . để thay đổi câu trả lời, ví dụ để thêm một tiêu đề thay vì một ứng dụng có thể thực hiện ResponseBodyAdvice và hoặc khai báo nó như một đậu @ControllerAdvice hoặc cấu hình nó trực tiếp trên 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; 
    } 
} 

Nguồn: Post processing of a Json response in spring MVC

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