杰克逊 2.0 和 Spring 3.1

Posted

技术标签:

【中文标题】杰克逊 2.0 和 Spring 3.1【英文标题】:Jackson 2.0 with Spring 3.1 【发布时间】:2012-05-12 07:10:12 【问题描述】:

Spring MVC 3.1 是否与 Jackson 2.0 兼容? Spring MVC 在类路径上自动检测 Jackson 并委托 Jackson 请求 JSON 内容类型的请求是否仍然有效?

【问题讨论】:

他们为什么不呢?您是否尝试过并观察到它不起作用? ***.com/questions/10085088/… 【参考方案1】:

Keith Donald(来自 spring 资源)不久前发布了以下推文。

对 Jackson 2 的 Spring MVC 支持;也与杰克逊的本地人一起工作 “漂亮打印”功能https://gist.github.com/2423129

我还没有尝试过上面要点中的MappingJackson2HttpMessageConverter,但如果它不起作用,我会感到惊讶。

【讨论】:

是的,它有效,他们添加了 MappingJackson2HttpMessageConverter 类,该类旨在用于代替“旧” MappingJacksonHttpMessageConverter【参考方案2】:

在 Spring 3.2 中添加了对 Jackson 2 的支持,并且还向后移植到 Spring 3.1.2 (SPR-9507)

【讨论】:

如果您从 1.x 迁移,您需要更改您的 pom.xml(Step 1: Update Maven / JAR dependencies 从 cowtowncoder.com/blog/archives/2012/04/entry_469.html 是您需要的内置支持才能锁定)【参考方案3】:

从 Spring 3.1.2 开始,您只需将 jackson-databind jar 添加到您的类路径中。

在 Maven 中你可以这样配置它:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>$jackson.version</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>$jackson.version</version>
</dependency>

其余的魔法将由 spring 自动完成。

见:http://norrisshelton.wordpress.com/2012/07/15/spring-3-mvc-with-json-via-jackson-2-0/

【讨论】:

【参考方案4】:

对于 Spring 3.1.2 和 Jackson 2 -

如上所述,自动支持 JustWorks™

但配置没有,因为大多数网络都充斥着 Spring3/Jackson2 之前的配置机制

因此,为了后代,我将列出一个 hack(?或者这是官方方式)来配置 Jackson 转换器。在这种特殊情况下,我将转换器配置为以 ISO-8601 格式返回日期:

package foo.bar.JacksonConfig;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Component;

@Component
public class JacksonConfig implements BeanPostProcessor 

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException 
        return bean;
    

    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException 
        if (bean instanceof MappingJackson2HttpMessageConverter) 
            MappingJackson2HttpMessageConverter jsonConverter =
                    (MappingJackson2HttpMessageConverter) bean;
            ObjectMapper objectMapper = jsonConverter.getObjectMapper();
            objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
            jsonConverter.setObjectMapper(objectMapper);
        
        return bean;
    

【讨论】:

我确定这不是官方的方式,但它很聪明! 这里描述了“官方”的配置方法:wallsofchange.wordpress.com/2013/02/02/…。 Jackson 2 的唯一区别是您必须使用MappingJackson2HttpMessageConverter 而不是MappingJacksonHttpMessageConverterSerializationFeature.WRITE_DATES_AS_TIMESTAMPS 而不是SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS【参考方案5】:

需要明确的是,Spring 3.1 没有对 Jackson 2 的原生支持。它在 Spring 3.2 中

【讨论】:

【参考方案6】:

我没有测试与 Jackson 2.0 兼容的 Spring MVC 3.1。但我遇到 3.0.5 兼容问题。最后发现Spring MVC 3.0.5只兼容Jackson 1.0.0,肯定Jackson 1.5.3不兼容!!!

【讨论】:

以上是关于杰克逊 2.0 和 Spring 3.1的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Sleuth 2.0 记录 MDC?

Spring security oAuth 2.0(无效令牌不包含资源ID(oauth2-resource))

杰克逊 JSON、Spring MVC 4.2 和 Hibernate JPA 问题的无限递归

迁移到 Spring Boot 2.2.0 @JsonIgnore 不起作用

弹簧安全 3.1 +JSF 2.0 。 ManagedBeans 中注释方法的问题?

杰克逊自定义反序列化器在 Spring Boot 中不起作用