Если у вас есть несколько методов ресурсов изображения, стоит создать MessageBodyWriter для вывода BufferedImage:
@Produces({ "image/png", "image/jpg" })
@Provider
public class BufferedImageBodyWriter implements MessageBodyWriter<BufferedImage> {
@Override
public boolean isWriteable(Class<?> type, Type type1, Annotation[] antns, MediaType mt) {
return type == BufferedImage.class;
}
@Override
public long getSize(BufferedImage t, Class<?> type, Type type1, Annotation[] antns, MediaType mt) {
return -1; // not used in JAX-RS 2
}
@Override
public void writeTo(BufferedImage image, Class<?> type, Type type1, Annotation[] antns, MediaType mt, MultivaluedMap<String, Object> mm, OutputStream out) throws IOException, WebApplicationException {
ImageIO.write(image, mt.getSubtype(), out);
}
}
Этот MessageBodyWriter будет использоваться автоматически, если для Джерси включено автообнаружение, в противном случае его необходимо вернуть пользовательскому подклассу приложения. См. JAX-RS Entity Provider для получения дополнительной информации.
Как только это будет установлено, просто верните BufferedImage из метода ресурса, и он будет выведен в виде данных файла изображения:
@Path("/whatever")
@Produces({"image/png", "image/jpg"})
public Response getFullImage(...) {
BufferedImage image = ...;
return Response.ok(image).build();
}
Пара преимуществ этого подхода:
- Он пишет в ответ OutputSteam, а не в посредник BufferedOutputStream
- Поддерживает вывод png и jpg (в зависимости от типов носителей, разрешенных методом ресурса)