Можно ли перенаправить ответ шаблона JSP Джерси на InputStream? - PullRequest
0 голосов
/ 22 сентября 2011

Все,

Я использую Java / Jersey 1.9 для создания веб-службы, которая генерирует XML.Я генерирую XML, используя шаблон JSP (явно через класс Viewable).Есть ли способ перенаправить результаты JSP в локальный InputStream для дальнейшей обработки?На данный момент я фактически называю свой собственный веб-сервис XML как обратную петлю http (localhost) из другого метода.

Спасибо за любые идеи,

Ian

@GET @Path("kml")
@Produces("application/vnd.google-earth.kml+xml")
public Viewable getKml(
        @QueryParam("lat") double lat,
        @QueryParam("lon") double lon,
        @QueryParam("alt") double alt) {

    overflights = new SatelliteOverflightModel(
            context, new SatelliteOverflightModel.Params(lat, lon, alt)
            ).getOverflights();

    return new Viewable("kml", this);
}

@GET @Path("kmz")
@Produces("application/vnd.google-earth.kmz")
public InputStream getKmz(@Context UriInfo uriInfo,
        @QueryParam("lat") double lat,
        @QueryParam("lon") double lon,
        @QueryParam("alt") double alt)
        throws IOException {

    Client client = Client.create();
    WebResource webr = 
            client.resource(uriInfo.getBaseUri()+"overflights/kml");
    InputStream result =
            webr.queryParams(uriInfo.getQueryParameters()).get(InputStream.class);

    // Do something with result; e.g., add to ZIP archive and return

    return result;
}

1 Ответ

0 голосов
/ 22 сентября 2011

Вы можете рассмотреть возможность использования для этого контейнера ContainerResponseFilter вместо ресурса - см., Например, фильтр Gzip , который предоставляет Джерси.Разница будет в том, что ваш фильтр будет зависеть от заголовков Accept и Content-Type вместо заголовков Accept-Encoding и Content-Encoding (как это делает фильтр gzip).

Если вы настаиваете на использовании ресурса, вы можетеВнедрите интерфейс провайдеров на свой ресурс, найдите правильный MessageBodyWritter и вызовите метод write для него:

@GET @Path("kmz")
@Produces("application/vnd.google-earth.kmz")
public InputStream getKmz(@Context UriInfo uriInfo,
        @QueryParam("lat") double lat,
        @QueryParam("lon") double lon,
        @QueryParam("alt") double alt,
        @Context Providers providers,
        @Context HttpHeaders headers)
        throws IOException {

    Viewable v = getKml(lat, lon, alt);
    MessageBodyWriter<Viewable> w = providers.getMessageBodyWriter(Viewable.class, Viewable.class, new Annotation[0], "application/xml");
    OutputStream os = //create the stream you want to write the viewable to (ByteArrayOutputStream?)
    InputStream result = //create the stream you want to return
    try {
        w.writeTo(v, v.getClass(), v.getClass(), new Annotation[0], headers, os);
        // Do something with result; e.g., add to ZIP archive and return
    } catch (IOException e) {
        // handle
    }
    return result;
}

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это не в моей голове - не проверено:)

...