2012-04-16 3 views
1

Extjs 클라이언트가 사용할 Resteasy를 사용하여 restfull 서비스를 구현하고 있으며 래퍼 클래스를 사용하지 않고 HTTP 응답에서 검색 한 json 객체를 더 많은 특성으로 꾸미고 싶습니다.Resteasy로 json 응답을 장식하는 방법

원시 개체 :

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

장식 개체 :

{ 
    "success":"true", 
    "root":{ 
      "id":"1", 
      "name":"Diego" 
      } 
} 
서비스 방법 또는 오버라이드 (override) 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()); 
        } 
    } 
    
관련 문제