1

Extjsクライアントによって消費されるResteasyを使用してrestfullサービスを実装していますが、サービスメソッドで追加の属性を持つラッパークラスを使用したり、JacksonJsonProviderの
例をオーバーライドしたりせずに、http応答で取得したjsonオブジェクトをさらにいくつかの属性で装飾したいと考えています。 :

生のオブジェクト:

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

装飾されたオブジェクト:

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

JAXBデコレータを見つけましたが、jsonタイプのデコレータを実装できませんでした。

インターセプターを使用してシリアル化されるエンティティをラッパーに置き換えようとしましたが、コレクションであるエンティティを置き換えると機能しません。

助言がありますか?

4

1 に答える 1

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());
        }
    }
    
于 2012-12-24T00:22:47.557 に答える