当前位置: 首页 > 面试题库 >

使用RestTemplate时如何配置内部Jackson映射器?

贺佑运
2023-03-14
问题内容

我想更新Spring RestTemplate所使用的jackson映射器的SerializationConfig.Feature …属性,任何想法都知道如何获得它或在哪里可以/应该对其进行配置。


问题答案:

默认RestTemplate构造函数注册一组HttpMessageConverter

this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
this.messageConverters.add(new ResourceHttpMessageConverter());
this.messageConverters.add(new SourceHttpMessageConverter());
this.messageConverters.add(new XmlAwareFormHttpMessageConverter());
if (jaxb2Present) {
    this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
}
if (jacksonPresent) {
    this.messageConverters.add(new MappingJacksonHttpMessageConverter());
}
if (romePresent) {
    this.messageConverters.add(new AtomFeedHttpMessageConverter());
    this.messageConverters.add(new RssChannelHttpMessageConverter());
}

MappingJacksonHttpMessageConverter轮流,造成ObjectMapper直接实例。你可以找到该转换器并替换ObjectMapper或注册一个新的转换器。这应该工作:

@Bean
public RestOperations restOperations() {
    RestTemplate rest = new RestTemplate();
    //this is crucial!
    rest.getMessageConverters().add(0, mappingJacksonHttpMessageConverter());
    return rest;
}

@Bean
public MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter() {
    MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
    converter.setObjectMapper(myObjectMapper());
    return converter;
}

@Bean
public ObjectMapper myObjectMapper() {
    //your custom ObjectMapper here
}

在XML中,遵循以下原则:

<bean id="restOperations" class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">
        <util:list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="objectMapper" ref="customObjectMapper"/>
            </bean>
        </util:list>
    </property>
</bean>

<bean id="customObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"/>

请注意,转换并不是真正的1:1-我必须显式地messageConverters以XML 创建列表,而采用@Configuration这种方法,我可以引用现有列表并直接对其进行修改。但这应该可行。



 类似资料:
  • 问题内容: 我正在尝试为作为JSON传入的对象创建内部类类型,但是尽管我在此处以及杰克逊的网站上都读了很多文章,但我似乎无法获得正确的组合,因此,如果其他人有任何指针,他们将不胜感激。我在下面发布了一些代码片段,并删除了所有的getter和setter,但我不认为他们需要发布。我正在使用Jackson 2.2。 我正在尝试反序列化的类: 我用来反序列化的代码: 我的JSON测试数据: 问题答案:

  • 你好,我有下一个json响应: 正如你所见,我有一个资源对象,里面有许多不同的对象,但这些对象可能会根据输入的不同而有所不同。我创建了下一个pojo: 在我的输入Pojo中: 导入java。util。列表 我将资源添加为对象列表,但我可以看到它是一个对象,其中包含不同的对象。如何将这些不同的对象映射到Java中的对象?事实上,我需要计算我有多少资源,但我正在努力实现这一目标。谢谢!

  • 本节描述了可用于映射器的各种配置模式。它假设你已经完成了 对象关系教程(1.x API) 并且知道如何构造和使用基本的映射器和关系。 映射Python类 声明性映射 非动态创建显式基础(与mypy一起使用,类似) 使用修饰符的声明性映射(无声明基) 具有数据类和属性的声明性映射 命令(又称经典)映射 具有数据类和属性的命令式映射 映射器配置概述 要映射的类 表或其他from子句对象 属性字典 其他

  • 如果我用替换它,它也可以工作,那么有人能告诉我使用的好处吗? 使用编写代码: 我可以看到我们可以在中保留参数的顺序,但在我的项目中这并不重要...因此,如果订单很重要,我仍然可以使用 因此,看起来用HashMap设置一些参数根本不是一个好主意...所以我暂时删除了公认的答案,等待关于这一点的更多解释...我有合适的转换器(),我的意思是如果我使用多值地图,我就没有异常,所以HashMap就是问题所

  • 问题内容: 我正在尝试使用Jackson将一些JSON对象映射到Java对象。JSON对象中的某些字段是必填字段(可以用标记),而某些字段是可选字段。 用Jackson映射之后,在JSON对象中未设置的所有字段在Java中都将具有空值。是否有类似的注释可以告诉Jackson为Java类成员设置默认值(如果为null)? 编辑:为了使问题更清楚,这里是一些代码示例。 Java对象: JSON对象可以