2014-01-03 1 views
0

У меня есть граф D3, сгенерированный на стороне клиента. Я отправляю данные SVG в Jersey Служба REST преобразует SVG в изображение (OutputStream) используя Transcoding. Когда я возвращаю ответ из службы, я мог видеть данные, возвращаемые в виде двоичного потока в консоли.Служба Джерси REST, чтобы вернуть ответ как изображение с окном загрузки

Что мне нужно - это окно загрузки браузера во всплывающее окно, как только служба возвращает ответ.

Ниже приводится фрагмент кода:

@POST 
@Path("downloadSVG") 
@Produces("image/png") 

public javax.ws.rs.core.Response downloadSVG(@Context HttpServletRequest request, @Context HttpServletResponse httpServletResponse,String values){ 

       LOGGER.info("Inside downloadSVG service."); 

       javax.ws.rs.core.Response graphImage = null; 
       JSONObject data = new JSONObject(values); 
       String svgXML = data.get("svgURL").toString(); 
       try { 

        OutputStream os = httpServletResponse.getOutputStream(); 
        JPEGTranscoder t = new JPEGTranscoder(); 
        t.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8)); 
        InputStream is = new ByteArrayInputStream(svgXML.getBytes()); 
        TranscoderInput input = new TranscoderInput(is); 
        TranscoderOutput output = new TranscoderOutput(os); 
        t.transcode(input, output); 
        LOGGER.info("Graph image generated. Trying to return it to client."); 
        graphImage = javax.ws.rs.core.Response.ok(os).header("Content-Disposition", "attachment;  
       filename=graph.png").type("image/png").build(); 
      os.flush(); 
        os.close(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } catch (TranscoderException e) { 
        e.printStackTrace(); 
       } 
       return graphImage; 
} 

После того, как эта услуга называется я получаю следующее Exception на консоли сервера:

SLF4J: This version of SLF4J requires log4j version 1.2.12 or later. See also http://www.slf4j.org/codes.html#log4j_version 
Jan 03, 2014 3:21:32 PM com.sun.jersey.spi.container.ContainerResponse write 
SEVERE: A message body writer for Java class org.apache.catalina.connector.CoyoteOutputStream, and Java type class org.apache.catalina.connector.CoyoteOutputStream, and MIME media type image/png was not found 
Jan 03, 2014 3:21:32 PM com.sun.jersey.spi.container.ContainerResponse write 
SEVERE: The registered message body writers compatible with the MIME media type are: 
image/* -> 
    com.sun.jersey.core.impl.provider.entity.RenderedImageProvider 
*/* -> 
    com.sun.jersey.core.impl.provider.entity.FormProvider 
    com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider 
    com.sun.jersey.core.impl.provider.entity.StringProvider 
. 
. 
Jan 03, 2014 3:21:32 PM com.sun.jersey.spi.container.ContainerResponse logException 
SEVERE: Mapped exception to response: 500 (Internal Server Error) 
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class org.apache.catalina.connector.CoyoteOutputStream, and Java type class org.apache.catalina.connector.CoyoteOutputStream, and MIME media type 
image/png was not found 
     at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285) 
     at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1448) 
     at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360) 
. 
. 
. 
Caused by: com.sun.jersey.api.MessageException: A message body writer for Java class org.apache.catalina.connector.CoyoteOutputStream, and Java type class org.apache.catalina.connector.CoyoteOutputStream, and MIME media type image/png was not found 

... 56 more 

Я думаю, что мне не хватает какой-Джерси зависимость.

Любые указатели приветствуются. Спасибо заранее.

ответ

2

Я думаю, что у меня отсутствует некоторая зависимость от Джерси.

Нет, я так не думаю ... Я считаю, что основная проблема заключается в том, что вы не можете напрямую манипулировать ответом OutputStream и возвращать ответ из вашего метода downloadSVG.

Любые указатели приветствуются.

Более чистый подход состоит в том, чтобы отделить логику, которая создает изображение из логики, которая передает изображение клиенту. Выезд MessageBodyWriter. Он дает вам доступ к запросу OutputStream и позволяет вам манипулировать заголовками ответов.

Вот что я хотел бы сделать:

1) Создайте новый класс (MyPNG). Измените метод REST, чтобы вернуть MyPNG, а не Response, и пометить его тегом @Produces.

@Produces("image/png") 
public MyPNG downloadSVG(@Context HttpServletRequest request, @Context HttpServletResponse httpServletResponse,String values){ 

2) В вашем методе REST, читать InputStream и создать и вернуть новый экземпляр MyPNG

3) Реализовать MessageBodyWriter и сделать что-то подобное в методе WriteTo:

public PNGMessageBodyWriter implements MessageBodyWriter<MyPNG> { 
.... 
boolean isWriteable(java.lang.Class<?> type, 
       java.lang.reflect.Type genericType, 
       java.lang.annotation.Annotation[] annotations, 
       MediaType mediaType) 
{ 
    return mediaType.toString.equals("image/png"); 
} 
.... 
void writeTo(MyJPEG instance, java.lang.Class<?> type, java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] annotations, 
    MediaType mediaType, MultivaluedMap<java.lang.String,java.lang.Object> httpHeaders, java.io.OutputStream entityStream) throws java.io.IOException, 
        WebApplicationException 
{ 
    JPEGTranscoder t = new JPEGTranscoder(); 
    t.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8)); 
    InputStream is = new ByteArrayInputStream(instance.getBytes()); 
    TranscoderInput input = new TranscoderInput(is); 
    TranscoderOutput output = new TranscoderOutput(entityStream); 
    t.transcode(input, output); 
    httpHeaders.put("Content-Disposition", ""attachment;filename=" + instance.getFilename()); 
    // and so on.... 
    httpHeaders.put("whatever else", "some other value"); 
} 

4) Следуйте инструкциям, соответствующим вашей версии Джерси, чтобы зарегистрировать свой MessageBodyWriter в качестве поставщика.

+0

Спасибо. Я потерял надежду на получение ответа. Я обязательно попробую. –

Смежные вопросы