2011-11-06 1 views
0

Ma méthode GET du service Web RESTFul renvoie l'objet Java converti en JSON à l'aide de @Produce anotation sur la méthode.
Je souhaite ajouter une réponse JSON à CallBack en tant que rappel d'appel (réponse JSON). Comment cela peut-il être réalisé?Comment remplacer @Produce JAX-RS

Merci, Adam

Répondre

0

voulez-vous dire un jsonp? Si vous utilisez cxf il y a un filtre pour cela.

+0

Salut Peter, Comme je l'ai déjà mentionné, je veux modifier la réponse JSON générée par @Produce avant qu'elle ne soit renvoyée. Comment et où puis-je intervenir pour le faire? –

+0

vous pouvez ajouter un filtre à votre contrôleur, qui a accès à la fois à la demande et à la réponse. Si vous voulez faire quelque chose de standard, par exemple: JSONp alors il y a une solution prête à l'emploi sinon vous pouvez en créer une vous-même –

+0

J'utilise Jersey avec Jettison. Je ne suis pas sûr où et comment puis-je utiliser des filtres. Pouvez-vous s'il vous plaît me donner un exemple. L'extrait de code sera grandement apprécié. Merci –

1

Si vous voulez dire enveloppant le corps de la réponse originale avec le texte « callback (...) », vous pouvez le faire avec l'aide de la Jersey ContainerResponseFilter - voir le javadoc pour en savoir plus sur les filtres à conteneurs: http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/api/container/filter/package-summary.html

dans ce cas particulier, vous pouvez définir le filtre comme suit:

import com.sun.jersey.core.util.ReaderWriter; 
import com.sun.jersey.spi.container.ContainerRequest; 
import com.sun.jersey.spi.container.ContainerResponse; 
import com.sun.jersey.spi.container.ContainerResponseFilter; 
import com.sun.jersey.spi.container.ContainerResponseWriter; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import javax.ws.rs.core.HttpHeaders; 
import javax.ws.rs.core.MediaType; 

public class MyFilter implements ContainerResponseFilter { 

    private static class Wrapper implements ContainerResponseWriter { 
     private final ContainerResponseWriter crw; 

     private long contentLength; 

     private ContainerResponse response; 

     private ByteArrayOutputStream baos; 

     Wrapper (ContainerResponseWriter crw) { 
      this.crw = crw; 
     } 

     @Override 
     public OutputStream writeStatusAndHeaders(long contentLength, ContainerResponse response) throws IOException { 
      this.contentLength = contentLength; 
      this.response = response; 
      return this.baos = new ByteArrayOutputStream(); 
     } 

     @Override 
     public void finish() throws IOException { 
      byte[] entity = baos.toByteArray(); 

//   response.getHttpHeaders().putSingle(HttpHeaders.CONTENT_TYPE, "desired_new_content_type"); 

      OutputStream out = crw.writeStatusAndHeaders(contentLength, response); 
      ReaderWriter.writeToAsString("CallBack(", out, response.getMediaType()); 
      out.write(entity); 
      ReaderWriter.writeToAsString(")", out, response.getMediaType()); 
      crw.finish(); 
     } 
    } 

    @Override 
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) { 
     if (MediaType.APPLICATION_JSON_TYPE.isCompatible(response.getMediaType())) { 
      response.setContainerResponseWriter(
        new Wrapper(response.getContainerResponseWriter())); 
     } 
     return response; 
    } 

} 

BTW, vous pouvez utiliser un autre type de support pour indiquer que vous souhaitez que l'emballage se produire et dans le changement de filtre à application/JSON afin que le traitement suivant se passe correctement. Dans le filtre de réponse, vous pouvez ensuite le redéfinir sur ce qu'il était lors de l'encapsulation du résultat (voir la ligne commentée ci-dessus).

Questions connexes