Jackson Object Mapper 在提供扩展配置时不工作,但在 Spring Boot 中提供类级别/字段级别注释时工作

Posted

技术标签:

【中文标题】Jackson Object Mapper 在提供扩展配置时不工作,但在 Spring Boot 中提供类级别/字段级别注释时工作【英文标题】:Jackson Object Mapper not working when extended configuration provided but working when providing class level/field level annotations in Spring Boot 【发布时间】:2019-02-25 22:30:42 【问题描述】:

当我将 jjwt 安全添加到 Spring Boot 应用程序时,以下对象映射器配置不起作用。

@Configuration
public class CustomObjectMapper extends ObjectMapper 

/**
 * Default serial version id generated.
 */
private static final long serialVersionUID = 1L;

public CustomObjectMapper() 
    this.setSerializationInclusion(Include.NON_EMPTY);
    this.registerModule(new ThreeTenModule());
    this.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    

此处添加了安全依赖项

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.7.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-jwt</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
</dependency>

下面的 Jackson 注释在类/字段级别上起作用。

@JsonInclude(Include.NON_EMPTY) 

为什么没有将 bean 配置的自定义对象映射器用于序列化和反序列化?是否有其他库配置了覆盖我的自定义映射器的对象映射器?

【问题讨论】:

尝试如下但没有运气。 @Component public class CustomObjectMapper @Bean @Primary public ObjectMapper objectMapper() ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setSerializationInclusion(Include.NON_EMPTY); objectMapper.registerModule(new ThreeTenModule()); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); return objectMapper; 【参考方案1】:

经过长时间的调查,我注意到 @EnableWebMvc 注释的配置 bean 在一个依赖库中可用。并从here 得知@EnableWebMvc 禁用了Spring Boot 的MVC 自动配置,从而完全控制提供客户MVC 配置。 HTTP 消息转换器也将包含在 Spring MVC 组件中,这反过来又禁用了我的自定义杰克逊对象映射器配置。

PS:由于 jjwt 默认导入 jackson 数据绑定依赖项,因此它属于我的可疑列表。感觉很好,我可以 RCA。谢谢。

【讨论】:

以上是关于Jackson Object Mapper 在提供扩展配置时不工作,但在 Spring Boot 中提供类级别/字段级别注释时工作的主要内容,如果未能解决你的问题,请参考以下文章

导入 Jackson-Core-1.x.x 和 Jackson-Mapper-1.x.x 时,我在打包 APK 错误时收到重复文件

jackson-mapper使用工具类

使用 Jackson JSON Mapper 在 JSON 到 POJO 之间映射时出现 400 Bad Request

Jackson XML Mapper为列表编写两次元素名称

Spring mvc jackson json mapper-如何将unicode编码应用于json响应中的特殊字符

Jackson