2016-05-11 17 views
8

Meine Anwendung wird mit Spring Boot (1.3.3.RELEASE) mit Feder mvc, Federdaten jpa Hibernate gebaut. MySql ist die Datenbank und Jackson ist der Json Serializer. Auf Java 8.Stream JSON Ausgabe im Frühjahr MVC

Ich möchte einen großen Datensatz in meiner Controller-Methode zurückgeben. Anstatt alle Daten abrufen und dann in den jackson Serializer vorbei, ich will wie unten ein Strom von Objekten zurück:

@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; 
} 

meine DAO wie unten:

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

jedoch Jackson Serialisierung das Stream-Objekt anstelle des Inhalts des Streams. Die tatsächliche Ausgabe unten:

{"parallel" : false} 

Wie kann ich Jackson anweisen, den Inhalt und nicht das Stream-Objekt zu serialisieren?

Antwort

11

Dank this konnte ich das Problem lösen.

Ich hatte einen benutzerdefinierten httpMessageConverter, der mit Streams umzugehen versteht. Wie so:

@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; 
} 
+0

aus Neugier: Wie liest man, dass ' Stream 'mit' RestTemplate'? – Paizo

0

fand ich, dass auf diese Weise Unterstützung für Streams der Zugabe der schönen Ausgabe von LOCALDATE/Local brach, endete es wie folgt tun:

@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; 
} 
1

Es ist eine vorgeschlagene Lösung bei https://github.com/FasterXML/jackson-modules-java8/issues/3 Das könnte der bessere Weg sein.

Ich werde den Code hier nicht einfügen, wie es in diesem Problem aktualisiert werden kann.

Bisher habe ich keine Probleme mit diesem vorgeschlagenen Code gefunden habe, die ich habe mit anderen Modulen wie der Jdk8Module hinzugefügt für Optional als

jacksonObjectMapper.registerModule(new StreamModule());