我一直无法找到如何在spring boot 1.4中使用 Jackson2ObjectMapperBuilderCustomizer.java 来自定义Jackson的功能的示例。
用于在启动时定制杰克逊的doco 1.4 - http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-customize-the-jackson-
我的配置有效,但我不确定这是否是使用 Jackson2ObjectMapperBuilderCustomizer.java
自定义对象映射器的正确方法@Configuration
public class JacksonAutoConfiguration {
@Autowired
private Environment env;
@Bean
public Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder(
List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
Jackson2ObjectMapperBuilder builder = configureObjectMapper();
customize(builder, customizers);
return builder;
}
private void customize(Jackson2ObjectMapperBuilder builder,
List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
for (Jackson2ObjectMapperBuilderCustomizer customizer : customizers) {
customizer.customize(builder);
}
}
private Jackson2ObjectMapperBuilder configureObjectMapper() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
List<String> activeProfiles = asList(env.getActiveProfiles());
if (activeProfiles.contains(SPRING_PROFILE_DEVELOPMENT)) {
builder.featuresToEnable(SerializationFeature.INDENT_OUTPUT);
}
return builder;
}
}
为了提供一些上下文,这个类位于我自己的REST服务的spring starter项目中,它只是自动配置一些东西,比如ControllerAdvice和上面的一些简单的功能。
所以我的目标是扩展Jackson配置,而不是覆盖引导或其他包提供的任何配置。
答案 0 :(得分:28)
要自定义已经由Spring Boot预先配置的Jackson ObjectMapper
,我能够做到这一点(这里的示例是添加自定义反序列化器)。
配置类:
@SpringBootConfiguration
public class Application {
@Autowired
private BigDecimalDeserializer bigDecimalDeserializer;
...
@Bean
public Jackson2ObjectMapperBuilderCustomizer addCustomBigDecimalDeserialization() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.deserializerByType(BigDecimal.class, bigDecimalDeserializer);
}
};
}
...
}
我的自定义反序列化程序,以显示Spring如何获取它:
@Component
public class BigDecimalDeserializer extends StdDeserializer<BigDecimal> {
public BigDecimalDeserializer() {
super(BigDecimal.class);
}
@Override
public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
...
}
...
}
答案 1 :(得分:7)
这取决于你想要做什么。
如果除了默认执行的那些操作之外还要进行一些自定义,那么您应该创建自己的Jackson2ObjectMapperBuilderCustomizer
实现并将其作为bean公开。你现在拥有的是一个更复杂的版本。您可以只创建自己的定制器bean,而不是让定制器注入并自己调用它们,而Boot会为您调用它。
如果要完全控制并关闭所有Boot的自定义,请创建Jackson2ObjectMapperBuilder
或ObjectMapper
bean并根据需要进行配置。首选构建器方法,因为此构建器还用于配置由其他组件(如Spring Data REST)创建的ObjectMappers。
查看您的代码并退后一步,您可以通过使用特定于配置文件的配置文件(类似application-dev.properties
)来更简单地配置事物,以便缩进Jackson的输出。您可以阅读有关here的更多信息。
答案 2 :(得分:2)
just create an ObjectMapper
bean:
@Bean
ObjectMapper objectMapper() {
return Jackson2ObjectMapperBuilder
.json()
.featuresToEnable(MapperFeature.DEFAULT_VIEW_INCLUSION)
.build();
}