【问题标题】:How to configure spring controller to use different objectMapper for the response (serialization)如何配置spring控制器以使用不同的objectMapper进行响应(序列化)
【发布时间】: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 模板。
  • 不能选择具体的内容协商

【问题讨论】:

    标签: spring spring-boot jackson objectmapper


    【解决方案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 模型,因为它是自动生成的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2023-03-14
    • 2017-01-27
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多