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).
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? –
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 –
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 –