[英]How to customise the Jackson JSON mapper implicitly used by Spring Boot?
[英]How to customise Jackson in Spring Boot 1.4
我一直無法找到有關如何在 spring boot 1.4 中使用Jackson2ObjectMapperBuilderCustomizer.java來自定義 Jackson 功能的示例。
在 boot 1.4 中自定義 Jackson 的 doco - https://docs.spring.io/spring-boot/docs/1.4.x/reference/htmlsingle/#howto-customize-the-jackson-objectmapper
我的配置有效,但我不確定這是否是使用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 啟動項目中,它只是自動配置一些東西,比如 ControllerAdvice 和一些像上面這樣的瑣碎功能。
所以我的目標是擴展 Jackson 配置,而不是覆蓋 boot 或其他包提供的任何配置。
為了自定義已經由 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 {
...
}
...
}
這取決於你想要做什么。
如果您想在默認情況下進行一些自定義,那么您應該創建自己的Jackson2ObjectMapperBuilderCustomizer
實現並將其公開為 bean。 您目前擁有的是一個更復雜的版本。 無需注入定制器然后自己調用它們,您只需創建自己的定制器 bean,Boot 就會為您調用它。
如果你想完全控制並關閉所有 Boot 的自定義,那么創建一個Jackson2ObjectMapperBuilder
或ObjectMapper
bean 並根據需要配置它。 首選構建器方法,因為此構建器還用於配置由其他組件(如 Spring Data REST)創建的 ObjectMappers。
查看您的代碼並退后一步,您可以通過使用特定於配置文件的配置文件(例如application-dev.properties
)來更簡單地配置內容,以啟用 Jackson 的輸出縮進。 您可以在此處閱讀更多相關信息。
只需創建一個ObjectMapper
bean:
@Bean
ObjectMapper objectMapper() {
return Jackson2ObjectMapperBuilder
.json()
.featuresToEnable(MapperFeature.DEFAULT_VIEW_INCLUSION)
.build();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.