2012-04-16 26 views
1

我正在實施Resteasy的restfull服務,該服務將由Extjs客戶端使用,並且我想用一些更多屬性修飾在http響應中檢索到的json對象而不使用包裝類與在服務方法或重載JacksonJsonProvider
實施例的附加屬性:如何用Resteasy裝飾json響應

原始對象:

{ 
    "id":"1", 
    "name":"Diego" 
} 

裝飾對象:

{ 
    "success":"true", 
    "root":{ 
      "id":"1", 
      "name":"Diego" 
      } 
} 

我發現JAXB Decorators但我無法實現json類型的裝飾器。

我試圖用Interceptors代替將用包裝器序列化的實體,但如果替換爲集合的實體則不起作用。

有什麼建議嗎?

回答

1

您可以在傳遞給客戶端之前編寫一個封裝了JSON響應的攔截器。下面是一個例子代碼:

  1. 定義自定義HTTPServletResponseWrapper

    public class MyResponseWrapper extends HttpServletResponseWrapper { 
        private ByteArrayOutputStream byteStream; 
    
        public MyResponseWrapper(HttpServletResponse response, ByteArrayOutputStream byteStream) { 
         super(response); 
         this.byteStream = byteStream; 
        } 
    
        @Override 
        public ServletOutputStream getOutputStream() throws IOException { 
         return new ServletOutputStream() { 
          @Override 
          public void write(int b) throws IOException { 
           byteStream.write(b); 
          } 
         }; 
        } 
        @Override 
        public PrintWriter getWriter() throws IOException { 
         return new PrintWriter(byteStream); 
        } 
    } 
    
  2. 定義過濾器類:

    @WebFilter("/rest/*") 
    public class JSONResponseFilter implements Filter { 
    
        private final String JSON_RESPONSE = " { \"success\":\"true\", \"root\": "; 
        private final String JSON_RESPONSE_CLOSE = "}"; 
    
        /* .. */ 
    
        @Override 
        public void doFilter(ServletRequest request, ServletResponse response, 
          FilterChain chain) throws IOException, ServletException { 
    
         // capture result in byteStream by using custom responseWrapper 
         final HttpServletResponse httpResponse = (HttpServletResponse) response; 
         final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
         HttpServletResponseWrapper responseWrapper = new MyResponseWrapper(httpResponse, byteStream); 
    
         // do normal processing but capture results in "byteStream" 
         chain.doFilter(request, responseWrapper); 
    
         // finally, wrap response with custom JSON 
         // you can do fancier stuff here, but you get the idea 
         out.write(JSON_RESPONSE.getBytes()); 
         out.write(byteStream.toByteArray()); 
         out.write(JSON_RESPONSE_CLOSE.getBytes()); 
        } 
    }