当前位置: 首页 > 知识库问答 >
问题:

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

沈巴英
2023-03-14

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

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

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

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

    null
    null

共有1个答案

唐麒
2023-03-14

除了使用@primary注释的ObjectMapper之外,您还可以配置更多的ObjectMapper使用您选择的bean名称限定的ObjectMapper

@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”)将注入用@bean(“anyname”)
  • 配置的 ObjectMapper
@Autowired
private ObjectMapper objectMapper;

@Autowired
@Qualifier("mySpecialObjectMapper")
private ObjectMapper otherObjectMapper;
 类似资料:
  • 因此,在这种情况下,我想配置Spring/Jackson返回{}(2字节)。 我已经考虑过在调用中返回new Object(),否则将返回void,但IMO这是一个肮脏的sout,必须有更好的东西。

  • 我设置了一个类来返回定制的ObjectMapper。据我所知,让spring boot使用这个ObjectMapper的正确方法是将它声明为@primary,它就是这样。 但是,当我从controller方法返回一个对象时,它将使用默认的jackson ObjectMapper配置序列化。 如果我向我的控制器中添加一个显式的ObjectMapper并对其调用writeValueAsString,我

  • 我有一个使用Spring MVC 3.1.3的应用程序和使用Dojo1.4开发的UI。应用程序只有很少的控制器处理通过上传的二进制文件。控制器发送一个json响应,该响应必须用 我实现了web.xml中定义的自定义筛选器: 提前道谢。 更新:我禁用了Spring Security性,并用普通spring mvc进行了测试,但问题仍然存在。我修改了标题和问题描述。

  • 我得到了一个日期字段格式为的对象,我将其映射到一个对象中,如下所示: 现在我需要将这个对象作为json响应发送,但我需要它采用不同的格式: 如果我更改字段,反序列化失败: 如何使用不同的模式进行序列化

  • 我想在我的项目中使用Jackson的配置版本(忽略空值和snake_case,也使用一些自定义模块)。 在我的大型项目中,我无法让Spring MVC真正使用这个映射器。 如果我现在查看调试器中的值,它是。但是如果我让控制器运行,实际的响应是。 当我删除时,它就可以工作了。如何将配置的映射器与MVC一起使用,而不删除Web MVC的其余自动配置?

  • 我的微服务需要通过HTTP与2个不同的服务进行通信。1个与snake_caseJSON有API契约,而另一个使用camelCase。如何配置WebFlux在一组功能endpoint上使用某个Jackson反序列化和序列化JSON,而在不同endpoint上使用另一个? WebFlux文档展示了如何连接另一个ObjectMapper,但这适用于我的API的所有endpoint。所以现在要么我所有的J