我的RESTFul Web服务GET方法返回Java对象,该对象通过对方法使用@Produce anotation转换为JSON。
我想将JSON响应附加到CallBack作为CallBack(JSON响应)。如何实现这一目标?
谢谢, 亚当
答案 0 :(得分:1)
如果您的意思是使用“CallBack(...)”文本包装原始响应的正文,那么您可以使用ContainerResponseFilter使用Jersey执行此操作 - 请参阅javadoc以阅读有关容器过滤器的更多信息:http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/api/container/filter/package-summary.html
在这种特殊情况下,您可以按如下方式定义过滤器:
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;
}
}
顺便说一下,您可能希望使用不同的媒体类型来指示您希望进行包装,并在过滤器中将其更改为application / json,以便后续处理正确进行。在响应过滤器中,您可以将其更改回包装结果时的任何内容(请参阅上面注释掉的行)。
答案 1 :(得分:0)