2012-04-16 2 views
1

Я реализую restfull сервис с Resteasy, который будет потребляться клиентом Extjs, и я хочу украсить объект json, полученный в ответе http, с помощью еще нескольких атрибутов без использования класса-оболочки с дополнительными атрибутами в методе обслуживания или переопределения JacksonJsonProvider
Пример:Как украсить ответ json с Resteasy

сырья объект:

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

оформленный объект:

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

Я нашел JAXB Decorators, но я не смог реализовать декоратор для json-типа.

Я попытался заменить сущность, которая будет сериализована с помощью обертки с использованием Interceptors, но это не сработает, если заменить объект, являющийся коллекцией.

Любые предложения?

ответ

1

Вы можете написать Interceptor, который обертывает ваш ответ 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()); 
        } 
    } 
    
Смежные вопросы