Ich verwende Spring Boot (1.2.1) auf ähnliche Weise wie im Tutorial zum Erstellen eines RESTful-Webdiensts :
@RestController
public class EventController {
@RequestMapping("/events/all")
EventList events() {
return proxyService.getAllEvents();
}
}
Daher verwendet Spring MVC Jackson implizit zum Serialisieren meines EventList
Objekts in JSON.
Ich möchte jedoch einige einfache Anpassungen am JSON-Format vornehmen, z.
setSerializationInclusion(JsonInclude.Include.NON_NULL)
Die Frage ist, wie der implizite JSON-Mapper am einfachsten angepasst werden kann.
Ich habe den Ansatz in diesem Blog-Beitrag ausprobiert, indem ich einen CustomObjectMapper usw. erstellt habe, aber Schritt 3, "Registrieren von Klassen im Spring-Kontext", schlägt fehl:
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'jacksonFix': Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire method: public void com.acme.project.JacksonFix.setAnnotationMethodHandlerAdapter(org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter);
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]
found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
Es sieht so aus, als ob diese Anweisungen für ältere Versionen von Spring MVC gelten, während ich nach einer einfachen Möglichkeit suche, dies mit dem neuesten Spring Boot zum Laufen zu bringen.
java
spring
spring-mvc
jackson
spring-boot
Jonik
quelle
quelle
Antworten:
Wenn Sie Spring Boot 1.3 verwenden, können Sie die Einbeziehung der Serialisierung über Folgendes konfigurieren
application.properties
:Nach Änderungen in Jackson 2.7 verwendet Spring Boot 1.4
spring.jackson.default-property-inclusion
stattdessen eine Eigenschaft mit dem Namen :Siehe " Anpassen des Jackson ObjectMapper " in der Spring Boot-Dokumentation.
Wenn Sie eine frühere Version von Spring Boot verwenden, können Sie die Serialisierungseinbeziehung in Spring Boot am einfachsten konfigurieren, indem Sie Ihre eigene, entsprechend konfigurierte
Jackson2ObjectMapperBuilder
Bean deklarieren . Beispielsweise:quelle
@ComponentScan
,@EnableAutoConfiguration
etc)?@Configuration
Klasse Ihrer App angewendet werden . Die HauptklasseApplication
ist ein guter Ort dafür.Ich beantworte diese Frage etwas spät, aber jemand könnte dies in Zukunft nützlich finden. Der folgende Ansatz funktioniert neben vielen anderen Ansätzen am besten, und ich persönlich denke, er passt besser zu einer Webanwendung.
quelle
WebMvcConfigurer
In den Anwendungseigenschaften können viele Dinge konfiguriert werden. Leider ist diese Funktion nur in Version 1.3 verfügbar, aber Sie können eine Konfigurationsklasse hinzufügen
[UPDATE: Sie müssen am ObjectMapper arbeiten, da die
build()
-method aufgerufen wird, bevor die Konfiguration ausgeführt wird.]quelle
In der Dokumentation werden verschiedene Möglichkeiten angegeben, dies zu tun.
quelle
ObjectMapper
? Ich meine, die Standardeinstellung auch eine Gewohnheit zu behalten.Sie können Ihrer Bootstrap-Klasse eine folgende Methode hinzufügen, die mit Anmerkungen versehen ist
@SpringBootApplication
quelle
spring.jackson.serialization-inclusion=non_null
pflegte für uns zu arbeitenAls wir jedoch die Spring Boot-Version auf 1.4.2.RELEASE oder höher aktualisierten, funktionierte sie nicht mehr.
Nun noch eine Eigenschaft
spring.jackson.default-property-inclusion=non_null
die Magie.in der Tat
serialization-inclusion
ist veraltet. Das ist es, was meine Intelligenz auf mich wirft.Beginnen Sie also
spring.jackson.default-property-inclusion=non_null
stattdessen mit der Verwendungquelle
Ich bin auf eine andere Lösung gestoßen, die ganz nett ist.
Führen Sie grundsätzlich nur Schritt 2 des genannten Blogs aus und definieren Sie einen benutzerdefinierten ObjectMapper als Spring
@Component
. ( Die Dinge begannen zu arbeiten , wenn ich nur entfernt alle AnnotationMethodHandlerAdapter Sachen aus Schritt 3)Funktioniert, solange sich die Komponente in einem von Spring gescannten Paket befindet. (Verwenden von
@Primary
ist in meinem Fall nicht obligatorisch, aber warum nicht die Dinge explizit machen?)Für mich gibt es zwei Vorteile gegenüber dem anderen Ansatz:
Jackson2ObjectMapperBuilder
.new CustomObjectMapper()
stattnew ObjectMapper()
.quelle
ObjectMapper
Instanzen angewendet wird, die von Spring Boot erstellt oder konfiguriert wurden.@RestController
Klassen verwendet, die derzeit für mich ausreicht. (Sie meinen also, diese Instanzen werden von Spring MVC erstellt, nicht von Spring Boot?) Wenn ich jedoch auf andere Fälle stoße, in denen ObjectMappers instanziiert werden müssen, werde ich den Jackson2ObjectMapperBuilder-Ansatz berücksichtigen!Als ich versuchte, ObjectMapper in Spring Boot 2.0.6 primär zu machen, wurden Fehler angezeigt. Daher habe ich den von Spring Boot für mich erstellten geändert
Siehe auch https://stackoverflow.com/a/48519868/255139
quelle
Ich fand die oben beschriebene Lösung mit:
spring.jackson.serialization-inclusive = non_null
Nur ab der Version 1.4.0.RELEASE von Spring Boot arbeiten. In allen anderen Fällen wird die Konfiguration ignoriert.
Ich habe dies durch Experimentieren mit einer Modifikation des Spring Boot-Musters "Spring-Boot-Sample-Jersey" überprüft.
quelle
Ich kenne die Frage nach dem Frühlingsstiefel, aber ich glaube, dass viele Leute, die danach suchen, wie man das in einem Nicht-Frühlingsstiefel macht, wie ich fast den ganzen Tag suchen.
Oberhalb von Spring 4 ist keine Konfiguration erforderlich,
MappingJacksonHttpMessageConverter
wenn Sie nur die Konfiguration beabsichtigenObjectMapper
.Sie müssen nur tun:
Erstellen Sie in Ihrer Spring-Konfiguration diese Bean:
quelle