Estou usando Spring Boot (1.2.1), de maneira semelhante ao tutorial Construindo um serviço da Web RESTful :
@RestController
public class EventController {
@RequestMapping("/events/all")
EventList events() {
return proxyService.getAllEvents();
}
}
Acima, Spring MVC implicitamente usa Jackson para serializar meu EventList
objeto em JSON.
Mas quero fazer algumas personalizações simples para o formato JSON, como:
setSerializationInclusion(JsonInclude.Include.NON_NULL)
A questão é: qual é a maneira mais simples de personalizar o mapeador JSON implícito?
Tentei a abordagem nesta postagem do blog , criando um CustomObjectMapper e assim por diante, mas a etapa 3, "Registrar classes no contexto Spring", falhou:
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: {}
Parece que essas instruções são para versões mais antigas do Spring MVC, mas estou procurando uma maneira simples de fazer isso funcionar com o Spring Boot mais recente.
java
spring
spring-mvc
jackson
spring-boot
Jonik
fonte
fonte
Respostas:
Se estiver usando Spring Boot 1.3, você pode configurar a inclusão de serialização via
application.properties
:Após as mudanças no Jackson 2.7, Spring Boot 1.4 usa uma propriedade chamada em
spring.jackson.default-property-inclusion
vez disso:Consulte a seção " Customizar o Jackson ObjectMapper " na documentação do Spring Boot.
Se você estiver usando uma versão anterior do Spring Boot, a maneira mais fácil de configurar a inclusão de serialização no Spring Boot é declarar seu próprio
Jackson2ObjectMapperBuilder
bean configurado apropriadamente . Por exemplo:fonte
@ComponentScan
,@EnableAutoConfiguration
etc)?@Configuration
classe em seu aplicativo. AApplication
aula principal é um bom lugar para isso.Estou respondendo um pouco tarde a esta pergunta, mas alguém, no futuro, pode achar isso útil. A abordagem abaixo, além de muitas outras abordagens, funciona melhor e, pessoalmente, acho que seria mais adequada para um aplicativo da web.
fonte
WebMvcConfigurer
Muitas coisas podem ser configuradas nas propriedades do aplicativo. Infelizmente, esse recurso está apenas na versão 1.3, mas você pode adicionar uma classe de configuração
[ATUALIZAÇÃO: Você deve trabalhar no ObjectMapper porque o
build()
-method é chamado antes que a configuração seja executada.]fonte
A documentação indica várias maneiras de fazer isso.
fonte
ObjectMapper
? Quero dizer, manter o padrão também um costume.Você pode adicionar um método a seguir dentro de sua classe de bootstrap que é anotado com
@SpringBootApplication
fonte
spring.jackson.serialization-inclusion=non_null
costumava trabalhar para nósMas quando atualizamos a versão do Spring Boot para 1.4.2.RELEASE ou superior, ele parou de funcionar.
Agora, outra propriedade
spring.jackson.default-property-inclusion=non_null
está fazendo a mágica.na verdade,
serialization-inclusion
está obsoleto. Isso é o que meu intellij joga em mim.Então, começar a usar
spring.jackson.default-property-inclusion=non_null
em vezfonte
Eu tropecei em outra solução, que é muito boa.
Basicamente, execute apenas a etapa 2 do blog postado mencionado e defina um ObjectMapper customizado como Spring
@Component
. (As coisas começaram a funcionar quando acabei de remover todas as coisas do AnnotationMethodHandlerAdapter da etapa 3.)Funciona desde que o componente esteja em um pacote verificado pelo Spring. (Usar
@Primary
não é obrigatório no meu caso, mas por que não tornar as coisas explícitas.)Para mim, existem dois benefícios em comparação com a outra abordagem:
Jackson2ObjectMapperBuilder
.new CustomObjectMapper()
vez denew ObjectMapper()
.fonte
ObjectMapper
instância criada ou configurada pelo Spring Boot.@RestController
classes que atualmente é suficiente para mim. (Então você quer dizer que essas instâncias são criadas pelo Spring MVC, não Spring Boot?) Mas se eu encontrar outros casos onde ObjectMappers precisa ser instanciado, vou manter a abordagem Jackson2ObjectMapperBuilder em mente!Quando tentei tornar o ObjectMapper primário no spring boot 2.0.6, obtive erros, então modifiquei aquele que o spring boot criou para mim
Consulte também https://stackoverflow.com/a/48519868/255139
fonte
Encontrei a solução descrita acima com:
spring.jackson.serialization-inclusão = non_null
Para funcionar apenas a partir da versão 1.4.0.RELEASE do Spring Boot. Em todos os outros casos, a configuração é ignorada.
Eu verifiquei isso experimentando uma modificação do exemplo de bota de mola "spring-boot-sample-jersey"
fonte
Eu sei a pergunta sobre a bota Spring, mas acredito que muitas pessoas procuram como fazer isso sem a bota Spring, como eu procurando quase o dia todo.
Acima do Spring 4, não há necessidade de configurar
MappingJacksonHttpMessageConverter
se você apenas pretende configurarObjectMapper
.Você só precisa fazer:
E em sua configuração Spring, crie este bean:
fonte