如何覆盖@Produce JAX-RS

时间:2011-11-06 00:06:28

标签: jax-rs

我的RESTFul Web服务GET方法返回Java对象,该对象通过对方法使用@Produce anotation转换为JSON。
我想将JSON响应附加到CallBack作为CallBack(JSON响应)。如何实现这一目标?

谢谢, 亚当

2 个答案:

答案 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)

你是说JSONp吗?如果您使用cxf,则会有一个过滤器。