2016-05-11 15 views
8

私のアプリケーションは、spring mvc、spring data jpa hibernateでSpringブート(1.3.3.RELEASE)を使用して構築されています。 MySqlはデータベースで、JacksonはJsonシリアライザです。 Java 8についてストリームSpring MVCでJSON出力

私のコントローラメソッドで膨大なデータセットを返したいと思います。代わりに、すべてのデータを取得し、その後、ジャクソン・シリアライザに渡すので、私は以下のようなオブジェクトのストリームを返すようにしたい:

@RequestMapping(value = "/candidates/all", method = RequestMethod.GET) 
public Stream<Candidate> getAllCandidates(){ 
    try { 
     return candidateDao.findAllByCustomQueryAndStream(); 
    } catch(Exception e){ 
     LOG.error("Exception in getCandidates",e); 
    } 
    return null; 
} 

私のDAOは以下のようなものです:

@Query("select c from Candidate c") 
public Stream<Candidate> findAllByCustomQueryAndStream(); 

しかし、ジャクソンはシリアル化されストリームの内容ではなく、ストリームオブジェクト。実際の出力は次のとおりです。

{"parallel" : false} 

ストリームオブジェクトではなくコンテンツをシリアル化するようにJacksonに指示するにはどうすればよいですか?

答えて

11

thisのおかげで、私はこの問題を解決できました。

ストリームを処理する方法を理解するカスタムhttpMessageConverterを提供しました。これと同じように:

@Bean 
public Module customModule() { 
    SimpleModule module = new SimpleModule("Stream"); 
    module.addSerializer(Stream.class, new JsonSerializer<Stream>() { 

     @Override 
     public void serialize(Stream value, JsonGenerator gen, SerializerProvider serializers) 
       throws IOException, JsonProcessingException { 
      serializers.findValueSerializer(Iterator.class, null) 
        .serialize(value.iterator(), gen, serializers); 

     } 
    }); 
    return module; 
} 
+0

などのオプションのためのJdk8Moduleなどの他のモジュールで追加したその提案コードですべての問題を発見していませんでした:どのようにあなたは 'ことを読んでくださいストリーム '' RestTemplate'を使用していますか? – Paizo

0

私はストリームのサポートを追加するこの方法は、このようにそれをやってしまった、LOCALDATE/LocalDateTimeをの素敵な出力を破ったことがわかりましたそれは良い方法かもしれない。

この問題で更新される可能性があるため、ここにコードを貼り付けません。

これまでのところ、私は、このような

好奇心のうち
jacksonObjectMapper.registerModule(new StreamModule()); 
1

https://github.com/FasterXML/jackson-modules-java8/issues/3で提案された解決策があります:

@Bean 
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); 
ObjectMapper objectMapper =jsonConverter.getObjectMapper(); 
SimpleModule module = new SimpleModule("Stream"); 
module.addSerializer(Stream.class, new JsonSerializer<Stream>() { 


    @Override 
    public void serialize(Stream value, JsonGenerator gen, SerializerProvider serializers) 
      throws IOException, JsonProcessingException { 
     serializers.findValueSerializer(Iterator.class, null) 
     .serialize(value.iterator(), gen, serializers); 

    } 
}); 

objectMapper.registerModule(module); 
jsonConverter.setObjectMapper(objectMapper); 
return jsonConverter; 
} 
関連する問題