Как переписать @Produce JAX-RS - PullRequest
0 голосов
/ 06 ноября 2011

Мой метод GET веб-службы RESTFul возвращает Java-объект, который преобразуется в JSON с помощью аннотации @Produce в методе.
Я хочу добавить ответ JSON в CallBack как CallBack (ответ JSON). Как это можно достичь?

Спасибо, Адам

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Если вы хотите обернуть тело исходного ответа текстом «CallBack (...)», то вы можете сделать это с Джерси, используя ContainerResponseFilter - см. Документацию javadoc, чтобы узнать больше о фильтрах контейнера: *

В этом конкретном случае вы можете определить фильтр следующим образом:

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, чтобы последующая обработка происходила правильно. В фильтре ответов вы можете изменить его обратно на то, что было при переносе результата (см. Закомментированную строку выше).

0 голосов
/ 06 ноября 2011

вы имеете в виду JSONp? Если вы используете cxf, то для этого есть фильтр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...