如何配置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);
由于ObjectMapper
是singleton
,我所有的 REST 控制器都使用相同的 ObjectMapper。
但是,有一些控制器我想忽略空值,但我想保留我的控制器的其余部分来发送空值响应。
有没有办法配置它?所以最好的结果是我可以这样配置:
控制器 A、B、C -> ObjectMapper X(忽略空值) 控制器 D -> ObjectMapper Y(忽略空值) 默认(所有其他控制器)-> ObjectMapper Z(返回空值)需求说明:
我无法更改 POJO,因为它是自动生成的,我不想为此更新 codegen 库或 mustache 模板。 不能选择具体的内容协商【问题讨论】:
【参考方案1】:除了你的ObjectMapper
用@Primary
注释
您可以配置更多ObjectMapper
s,使用您选择的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