2016-08-24 1 views
-1

구현하기 전에 더 많은 정보를 얻고 다른 솔루션을 시도하고 싶습니다.Nestled 스트림을 사용한 스트리밍 REST 응답

구현중인 REST 서비스는 여러 필드의 이진 데이터와 간단한 문자열을 포함하는 모델을 제공합니다. 쉬운 방법은 String, byte [] 필드 등을 포함하는 POJOS를 구현하는 것입니다. Jackson은 base64를 사용하여 저를 serialize합니다. 케이크 한 조각.

하지만이 서비스는 스트림으로 제공하고 싶습니다. 바이너리 필드는 상당히 거대하며 이미 내 서비스 내의 다른 외부 리소스에서 수신되는 스트림으로 처리됩니다. 따라서 그들을 바이트 배열로 읽은 다음 jackson이 base64로 변환하도록 허용하면 성능이 저하 될 수 있습니다.

아마도 내 POJO 내에 OutputStream 객체를 가질 수 있습니다. 잭슨이 스트림을 통해 (base64로 인코딩하는 동안) 아니면 전체 스트림을 먼저 읽을 것입니까? 아마 잭슨이 이걸 전혀 지원하지 않을거야?

또 다른 옵션으로 여러 부분 응답을 사용할 수도 있지만 저지가 모든 부분을 버퍼링하지 않을지는 확실하지 않습니까?

아니면 사용자 지정 잭슨 시리얼 라이저를 사용하는 것이 유일한 방법입니까? 이것을 수행하기 위해 StreamingOutput을 사용할 수 있습니까?

방금 ​​하나의 BLOB 인 경우 옥텟 스트림으로 반환하고 행복 하겠지만 언급 한대로 여러 바이너리 및 비 바이너리 필드가있는 데이터 모델이 있으며 실제로 모든 것을 반환하고자합니다. 전화 한 통.

그래서 뭐라고 말합니까? 내 목표를 달성하는 가장 쉬운 방법은 무엇입니까?

답변

0

아무도 관심이있는 경우 진행할 수있는 방법을 찾았습니다. 나는 완전히 확인되지 않은

public class InputStreamSerializer extends JsonSerializer<InputStream> { 

    @Override 
    public void serialize(InputStream inputStream, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { 
     jsonGenerator.writeBinary(Base64Variants.MIME_NO_LINEFEEDS, inputStream, -1); 
    } 
} 

:

public class ModelDTO { 
    private String someString; 
    private String someOtherString; 
    @JsonSerialize(using = InputStreamSerializer.class) 
    private InputStream firstBlob; 
    @JsonSerialize(using = InputStreamSerializer.class) 
    private InputStream secondBlob; 
... 
} 

그리고 시리얼 : 나는의 InputStream의 유형의 필드를 사용할 수있는 DTO 클래스에서

및 사용자 지정 serializer를 사용하도록 설정 그러나 내가 볼 수있는 것에서 잭슨은 OutputStream에 버퍼만을 사용하여 쓰기 때문에 전체 들어오는 스트림을 버퍼링하지 않습니다.

이것은 내 문제에 대한 (매우 간단한) 해결책이지만 누군가 다른 의견이 있으면 듣고 싶습니다.