Spring 使用 Jackson 全局设置 JsonAutoDetect
Spring with Jackson set JsonAutoDetect globally
在我的 spring 引导 Web 应用程序中,当我从请求映射的函数 return 时,我想将许多不同的 class 序列化为 JSON。这些 classes 仅包含没有 getter 的私有字段。为了让 Jackson 序列化这些私有字段,我可以使用以下注释对所有这些 classes 进行注释,这完全符合预期。
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
但是因为想要以这种方式序列化许多不同的 classes,所以我想在我的 spring 启动应用程序中全局声明。我尝试了以下方法来实现这一点:
将使用的 application.properties
中的字段可见性设置为任意。
spring.jackson.visibility.field=ANY
在主 class 中使用 @Bean
自定义 ObjectMapper
。
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper().setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
}
在主 class 中使用 @Bean
自定义 Jackson2ObjectMapperBuilder
。
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
return new Jackson2ObjectMapperBuilder().visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
}
使用配置 class 配置 Jackson2ObjectMapperBuilder
。
@Configuration
public class ObjectMapperConfig implements Jackson2ObjectMapperBuilderCustomizer {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
}
}
但是 none 这些方法对我有用。如果我在我想序列化的每个 class 上使用 @JsonAutoDetect
注释,它工作得很好,但是如果我尝试使用这些全局实现之一,我总是会收到以下错误:
WARN 5191 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class my.class.i.would.like.to.Serialize]
我不知道是什么导致了这种行为,或者我是否在其他地方遗漏了一些重要的东西,但我发现的所有全局方法都不起作用。尽管如此,我仍然不想注释所有单独的 classes 或不必在其中定义数千个 getter。
所有应该与 Spring 引导一起使用的选项都不起作用这一事实导致您必须(无意或故意)禁用 MVC 的自动配置 and/or杰克逊.
当您使用 @EnableWebMvc
添加配置 class 时,大多数与 Web 相关的自动配置将退避并使用 Spring 提供的默认值和您提供的配置。这也将使这些功能无法正常工作。
删除该注释并在 application.properties
中指定 属性 应该足以使其工作。
在我的 spring 引导 Web 应用程序中,当我从请求映射的函数 return 时,我想将许多不同的 class 序列化为 JSON。这些 classes 仅包含没有 getter 的私有字段。为了让 Jackson 序列化这些私有字段,我可以使用以下注释对所有这些 classes 进行注释,这完全符合预期。
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
但是因为想要以这种方式序列化许多不同的 classes,所以我想在我的 spring 启动应用程序中全局声明。我尝试了以下方法来实现这一点:
将使用的 application.properties
中的字段可见性设置为任意。
spring.jackson.visibility.field=ANY
在主 class 中使用 @Bean
自定义 ObjectMapper
。
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper().setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
}
在主 class 中使用 @Bean
自定义 Jackson2ObjectMapperBuilder
。
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
return new Jackson2ObjectMapperBuilder().visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
}
使用配置 class 配置 Jackson2ObjectMapperBuilder
。
@Configuration
public class ObjectMapperConfig implements Jackson2ObjectMapperBuilderCustomizer {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
}
}
但是 none 这些方法对我有用。如果我在我想序列化的每个 class 上使用 @JsonAutoDetect
注释,它工作得很好,但是如果我尝试使用这些全局实现之一,我总是会收到以下错误:
WARN 5191 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class my.class.i.would.like.to.Serialize]
我不知道是什么导致了这种行为,或者我是否在其他地方遗漏了一些重要的东西,但我发现的所有全局方法都不起作用。尽管如此,我仍然不想注释所有单独的 classes 或不必在其中定义数千个 getter。
所有应该与 Spring 引导一起使用的选项都不起作用这一事实导致您必须(无意或故意)禁用 MVC 的自动配置 and/or杰克逊.
当您使用 @EnableWebMvc
添加配置 class 时,大多数与 Web 相关的自动配置将退避并使用 Spring 提供的默认值和您提供的配置。这也将使这些功能无法正常工作。
删除该注释并在 application.properties
中指定 属性 应该足以使其工作。