2017-09-18 1 views
2

Hallo Ich versuche, Vavr zu meinem Projekt hinzuzufügen, gerade jetzt im Kampf mit der richtigen Serialization von Vavr.List Objekte. Unten ist mein Controller:Serializer/Deserializer für Vavr-Objekte

import io.vavr.collection.List; 

@GetMapping(value = "/xxx") 
    public List<EntityDeleted> getFile() { 
     return List.of(new EntityDeleted(true),new EntityDeleted(true),new EntityDeleted(true),new EntityDeleted(true)); 
} 

EntityDeleted ist mein benutzerdefiniertes Objekt, List ist Vavr Sammlung wie in Import-Anweisung gezeigt. Die Antwort Im in Postman bekommen ist:

{ 
    "empty": false, 
    "lazy": false, 
    "async": false, 
    "traversableAgain": true, 
    "sequential": true, 
    "singleValued": false, 
    "distinct": false, 
    "ordered": false, 
    "orNull": { 
     "deleted": true 
    }, 
    "memoized": false 
} 

wo ich JSON Liste meiner Objekte erwarten. Im Folgenden meine config:

@SpringBootApplication 
public class PlomberApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(PlomberApplication.class, args); 
    } 

    @Bean 
    public ObjectMapper jacksonBuilder() { 
     ObjectMapper mapper = new ObjectMapper(); 
     return mapper.registerModule(new VavrModule()); 
    } 
} 

und wenig pom.xml

<dependency> 
      <groupId>io.vavr</groupId> 
      <artifactId>vavr</artifactId> 
      <version>0.9.0</version> 
     </dependency> 
     <dependency> 
      <groupId>io.vavr</groupId> 
      <artifactId>vavr-jackson</artifactId> 
      <version>0.9.0</version> 
     </dependency> 

Antwort

0

Frühlings-Boot holt alle Instanzen com.fasterxml.jackson.databind.Module Klasse und initialisiert ObjectMapper mit ihnen. Es gibt keine Notwendigkeit für zusätzliche Magie.

Meine Abhängigkeiten sind wie folgt (Spring Boot 1.5.7.RELEASE):

dependencies { 
    compile('org.springframework.boot:spring-boot-starter-web') 
    testCompile('org.springframework.boot:spring-boot-starter-test') 
    compile group: 'io.vavr', name: 'vavr', version: '0.9.1' 
    compile group: 'io.vavr', name: 'vavr-jackson', version: '0.9.1' 
} 

Mit Anwendung wie diese configurured:

@SpringBootApplication 
public class BootvavrApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(BootvavrApplication.class, args); 
    } 

    @Bean 
    Module vavrModule() { 
     return new VavrModule(); 
    } 
} 

und Controller wie folgt abgebildet:

import io.vavr.collection.List; 
@RestController 
class TestController { 

    @GetMapping("/test") 
    List<String> testing() { 
     return List.of("test", "test2"); 
    } 
} 

Ausgabe lautet:

["test","test2"] 

Sie können prüfen, die Code hier heraus: https://github.com/mihn/bootvavr

+2

Ich habe die Lösung gefunden, ich hatte @EnableWebMvc Annotation in einer meiner Config-Klasse, die irgendwie meine Konfiguration zu Mapper überschreiben – filemonczyk

+0

Oh! Das könnte das tun. :) – mihn

1

bin ich mit SpringBoot nicht vertraut, aber es scheint, dass Sie das VavrModule Objekt anstelle des ObjectMapper in Ihrem jacksonBuilder() Methode zurückgeben soll .

Ich stütze mich auf diese Links gilt:

+0

probiert @Bean public Modul jacksonBuilder() { return new VavrModule(); } aber es funktioniert nicht. Ich nehme an, etwas überschreibt meine Mapper. – filemonczyk

1

Die ObjectMapper Sie sich als eine Bohne ist nicht nur derjenige sein Einsatz in JSON serialisiert , Spring MVC wird es nicht verwenden, da es nicht das ist, wonach er sucht.

Um Inhalt für HTTP Spring MVC verwendet HttpMessageConverter und wenn er Jackson in der Klassenpfad erkennt eine MappingJackson2HttpMessageConverter wird automatisch konfiguriert, wenn nicht angegeben.

Im Frühjahr Boot-Zugabe sollte genug sein, um das benutzerdefinierte MessageConverter zu registrieren:

@Bean 
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
    MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); 
    ObjectMapper mapper = new ObjectMapper(); 

    mapper.registerModule(new VavrModule()); 

    // Spring MVC default Objectmapper configuration 
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false); 

    jacksonConverter.setObjectMapper(mapper); 
    return jacksonConverter; 
} 

@Override 
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
    converters.add(customJackson2HttpMessageConverter()); 
    super.addDefaultHttpMessageConverters(); 
} 

:

@Bean 
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
    MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); 
    ObjectMapper mapper = new ObjectMapper(); 

    mapper.registerModule(new VavrModule()); 

    // Spring MVC default Objectmapper configuration 
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false); 

    jacksonConverter.setObjectMapper(mapper); 
    return jacksonConverter; 
} 

In einer reinen Spring MVC-Anwendung würden Sie den folgenden Code in der WebMvcConfigurerAdapter Klasse müssen hatten Some Documentation about ObjectMapper in Spring MVC

Ich hoffe, es hat geholfen!

+0

Ich habe es auch versucht, aber immer noch das gleiche Ergebnis, das ist wie im ersten Beitrag – filemonczyk

+0

Haben Sie versucht, @Primary zusätzlich der @Bean hinzufügen? Und welche Version von Spring boot verwenden Sie? –

+0

versucht @primary, Im mit 1.5.3 Spring Boot – filemonczyk

Verwandte Themen