J'utilise Spring Boot (1.2.1), de la même manière que dans leur tutoriel sur la création d'un service Web RESTful :
@RestController
public class EventController {
@RequestMapping("/events/all")
EventList events() {
return proxyService.getAllEvents();
}
}
Donc ci-dessus, Spring MVC utilise implicitement Jackson pour sérialiser mon EventList
objet en JSON.
Mais je veux faire quelques personnalisations simples au format JSON, telles que:
setSerializationInclusion(JsonInclude.Include.NON_NULL)
La question est la suivante: quel est le moyen le plus simple de personnaliser le mappeur JSON implicite?
J'ai essayé l'approche dans ce billet de blog , en créant un CustomObjectMapper et ainsi de suite, mais l'étape 3, «Enregistrer les classes dans le contexte Spring», échoue:
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: {}
Il semble que ces instructions concernent les anciennes versions de Spring MVC, alors que je recherche un moyen simple de le faire fonctionner avec le dernier Spring Boot.
Réponses:
Si vous utilisez Spring Boot 1.3, vous pouvez configurer l'inclusion de sérialisation via
application.properties
:Suite aux modifications apportées à Jackson 2.7, Spring Boot 1.4 utilise une propriété nommée à la
spring.jackson.default-property-inclusion
place:Voir la section « Personnaliser le Jackson ObjectMapper » dans la documentation de Spring Boot.
Si vous utilisez une version antérieure de Spring Boot, le moyen le plus simple de configurer l'inclusion de la sérialisation dans Spring Boot est de déclarer votre propre
Jackson2ObjectMapperBuilder
bean correctement configuré . Par exemple:la source
@ComponentScan
,@EnableAutoConfiguration
etc.)?@Configuration
classe de votre application. LaApplication
classe principale est un bon endroit pour cela.Je réponds un peu tard à cette question, mais quelqu'un, à l'avenir, pourrait trouver cela utile. L'approche ci-dessous, en plus de nombreuses autres approches, fonctionne mieux et je pense personnellement qu'elle conviendrait mieux à une application Web.
la source
WebMvcConfigurer
Beaucoup de choses peuvent être configurées dans les propriétés de l'application. Malheureusement, cette fonctionnalité uniquement dans la version 1.3, mais vous pouvez ajouter une classe de configuration
[MISE À JOUR: Vous devez travailler sur l'ObjectMapper car la
build()
méthode est appelée avant l'exécution de la configuration.]la source
La documentation indique plusieurs façons de procéder.
la source
ObjectMapper
? Je veux dire garder la valeur par défaut ainsi qu'une coutume.Vous pouvez ajouter une méthode suivante dans votre classe de bootstrap qui est annotée avec
@SpringBootApplication
la source
spring.jackson.serialization-inclusion=non_null
utilisé pour travailler pour nousMais lorsque nous avons mis à niveau la version Spring Boot vers 1.4.2.RELEASE ou une version supérieure, cela a cessé de fonctionner.
Maintenant, une autre propriété
spring.jackson.default-property-inclusion=non_null
fait la magie.en fait,
serialization-inclusion
est obsolète. C'est ce que mon intellij me lance.Alors, commencez à utiliser à la
spring.jackson.default-property-inclusion=non_null
placela source
Je suis tombé sur une autre solution, ce qui est plutôt sympa.
Fondamentalement, ne faites que l' étape 2 du blog publié mentionné et définissez un ObjectMapper personnalisé en tant que Spring
@Component
. (Les choses ont commencé à fonctionner lorsque je viens de supprimer tous les éléments AnnotationMethodHandlerAdapter de l'étape 3.)Fonctionne tant que le composant est dans un package analysé par Spring. (L'utilisation
@Primary
n'est pas obligatoire dans mon cas, mais pourquoi ne pas rendre les choses explicites.)Pour moi, il y a deux avantages par rapport à l'autre approche:
Jackson2ObjectMapperBuilder
.new CustomObjectMapper()
au lieu denew ObjectMapper()
.la source
ObjectMapper
instance créée ou configurée par Spring Boot.@RestController
classes qui me suffit actuellement. (Vous voulez dire que ces instances sont créées par Spring MVC, pas par Spring Boot?) Mais si je rencontre d'autres cas où les ObjectMappers doivent être instanciés, je garderai à l'esprit l'approche Jackson2ObjectMapperBuilder!Quand j'ai essayé de rendre ObjectMapper primaire dans Spring Boot 2.0.6, j'ai eu des erreurs J'ai donc modifié celui que Spring Boot a créé pour moi
Voir également https://stackoverflow.com/a/48519868/255139
la source
J'ai trouvé la solution décrite ci-dessus avec:
spring.jackson.serialization-inclusion = non_null
Pour ne fonctionner qu'à partir de la version 1.4.0.RELEASE de spring boot. Dans tous les autres cas, la configuration est ignorée.
J'ai vérifié cela en expérimentant une modification de l'échantillon de botte à ressort "spring-boot-sample-jersey"
la source
Je connais la question qui pose la botte Spring, mais je crois que beaucoup de gens cherchent comment faire cela dans une botte non Spring, comme moi qui recherchent presque toute la journée.
Au-dessus de Spring 4, il n'est pas nécessaire de configurer
MappingJacksonHttpMessageConverter
si vous avez uniquement l'intention de configurerObjectMapper
.Il vous suffit de faire:
Et dans votre configuration Spring, créez ce bean:
la source