如何配置spring控制器以使用不同的objectMapper进行响应(序列化)

Posted

技术标签:

【中文标题】如何配置spring控制器以使用不同的objectMapper进行响应(序列化)【英文标题】:How to configure spring controller to use different objectMapper for the response (serialization) 【发布时间】:2021-06-16 17:53:43 【问题描述】:

我为我的 SpringBoot 应用程序配置了自己的 ObjectMapper,假设对象映射器如下所示(简化):

    @Bean
    @Primary
    public ObjectMapper objectMapper() 
        return new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    

由于ObjectMappersingleton,我所有的 REST 控制器都使用相同的 ObjectMapper。 但是,有一些控制器我想忽略空值,但我想保留我的控制器的其余部分来发送空值响应。

有没有办法配置它?所以最好的结果是我可以这样配置:

控制器 A、B、C -> ObjectMapper X(忽略空值) 控制器 D -> ObjectMapper Y(忽略空值) 默认(所有其他控制器)-> ObjectMapper Z(返回空值)

需求说明:

我无法更改 POJO,因为它是自动生成的,我不想为此更新 codegen 库或 mustache 模板。 不能选择具体的内容协商

【问题讨论】:

【参考方案1】:

除了你的ObjectMapper@Primary 注释 您可以配置更多ObjectMappers,使用您选择的bean名称。

@Bean
@Primary
public ObjectMapper objectMapper() 
    ObjectMapper objectMapper = new ObjectMapper()
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    return objectMapper;


@Bean("mySpecialObjectMapper")
public ObjectMapper anotherObjectMapper() 
    ObjectMapper objectMapper = new ObjectMapper()
            /*  do some other configuration */;
    return objectMapper;

然后你可以像这样在你的控制器中引用它们:

只提供@Autowired 将注入主ObjectMapper。 将@Autowired@Qualifier("anyName") 一起提供将注入 ObjectMapper 配置为@Bean("anyName")
@Autowired
private ObjectMapper objectMapper;

@Autowired
@Qualifier("mySpecialObjectMapper")
private ObjectMapper otherObjectMapper;

【讨论】:

我想要实现的是让Spring使用其他ObjectMapper依赖于控制器。例如,对于Response 类,我使用了javax.ws.core.response,我只需要传入模型。但是@Component(我的控制器)对 JSON 的转换是由主 ObjectMapper 进行的,因为它将使用 Spring 提供的内容。【参考方案2】:

也许你只需要使用@JsonInclude(JsonInclude.Include.NON_NULL)。尝试在响应模型级别修复它。

【讨论】:

是的,它会起作用,但正如我在需求说明中提到的,我无法更改 POJO 模型,因为它是自动生成的。

以上是关于如何配置spring控制器以使用不同的objectMapper进行响应(序列化)的主要内容,如果未能解决你的问题,请参考以下文章

如何配置事务管理以在 Spring 中使用 2 个不同的数据库?

如何配置 IntelliJ HQL 控制台以使用 Spring Boot

如何配置 Spring Security 以允许在 JSP 页面中使用 hasPermission?

Spring Boot 自定义Jackson ObjectMapper

如何在 Spring 中以编程方式获取当前的活动/默认环境配置文件?

如何在 Spring 中以编程方式获取当前的活动/默认环境配置文件?