2012-04-16 8 views
1

J'implémente un service de restauration avec Resteasy qui sera consommé par un client Extjs, et je veux décorer l'objet json récupéré dans la réponse http avec quelques attributs supplémentaires sans utiliser une classe wrapper avec des attributs supplémentaires dans le mode de service ou JacksonJsonProvider dominante
Exemple:Comment décorer la réponse json avec Resteasy

objet brut:

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

objet décoré:

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

J'ai trouvé JAXB Decorators mais je ne pouvais pas implémenter un décorateur pour le type json.

J'ai essayé de remplacer l'entité qui sera sérialisée avec un wrapper en utilisant Interceptors mais cela ne fonctionne pas si un remplace l'entité qui est une collection.

Des suggestions?

Répondre

1

Vous pouvez écrire un intercepteur qui enveloppe votre réponse JSON avant qu'il ne soit transmis au client. Voici un exemple de code:

  1. Définir HTTPServletResponseWrapper personnalisée

    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. Définir classe de filtre:

    @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()); 
        } 
    }