2012-04-16 4 views
1

私はExtjsクライアントによって消費されるResteasyを使ってrestfullサービスを実装しています.HTTPレスポンスで取得されたjsonオブジェクトをラッパークラスを使用せずにいくつかの属性でデコレートしたいResteasyでjsonレスポンスを飾る方法

生対象:

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

飾らオブジェクト:

{ 
    "success":"true", 
    "root":{ 
      "id":"1", 
      "name":"Diego" 
      } 
} 
serviceメソッドやオーバーライドJacksonJsonProvider
例で追加の属性を持ちます

私は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()); 
        } 
    } 
    
関連する問題