jackson2 JSON ISO 8601来自JodaTime in Spring 3.2RC1

NA.*_*NA. 14 spring json spring-mvc jodatime jackson

我正在使用Spring MVC 3.2RC1中的REST API.

我正在获取一个带有org.joda.time.DateTime时间戳的JPA实体,并让Spring将其序列化为JSON

@RequestMapping(value = "/foobar", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
Run Code Online (Sandbox Code Playgroud)

使用Spring中的默认Jackson2设置,因为我只添加了

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.1.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

到我的POM,让Spring自己连接它.

控制器正在生成:

"created":{"year":2012,"dayOfMonth":30,"dayOfWeek":5,"era":1,"dayOfYear":335,"weekOfWeekyear":48,"weekyear":2012,"monthOfYear":11,"yearOfEra":2012,"yearOfCentury":12,"centuryOfEra":20,"millisOfSecond":39,"millisOfDay":52684039,"secondOfMinute":4,"secondOfDay":52684,"minuteOfHour":38,"minuteOfDay":878,"hourOfDay":14,"millis":1354282684039,"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"Europe/Stockholm"},"fixed":false,"id":"Europe/Stockholm"},"chronology":{"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"Europe/Stockholm"},"fixed":false,"id":"Europe/Stockholm"}},"afterNow":false,"beforeNow":true,"equalNow":false}
Run Code Online (Sandbox Code Playgroud)

但我希望它和ISO8601日期如2007-11-16T20:14:06.3Z(或带偏移量).

我的猜测是我需要访问ObjectMapper并设置mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 但是如何在使用时访问ObjectMapper

<mvc:annotation-driven />
Run Code Online (Sandbox Code Playgroud)

PS我使用UserType将对象持久化到PostgreSQL和JPA/Hibernate4以获得JodaTime支持.DS

更新

下面的配置为java.util.Date解决了它,但JodaTime仍然没有骰子.

<annotation-driven>
    <message-converters>
        <beans:bean
            class="org.springframework.http.converter.StringHttpMessageConverter" />
        <beans:bean
            class="org.springframework.http.converter.ResourceHttpMessageConverter" />
        <beans:bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <beans:property name="objectMapper">
                <beans:bean
                    class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
                    p:indentOutput="true" p:simpleDateFormat="yyyy-MM-dd'T'HH:mm:ss.SSSZ">
                </beans:bean>
            </beans:property>
        </beans:bean>
    </message-converters>
</annotation-driven>
Run Code Online (Sandbox Code Playgroud)

小智 12

或者,如果您更喜欢在Java中进行配置,它可能如下所示:

@Configuration
@EnableWebMvc
public class RestConfig extends WebMvcConfigurerAdapter {

    private ObjectMapper objectMapper() {
        Jackson2ObjectMapperFactoryBean bean = new Jackson2ObjectMapperFactoryBean();
        bean.setIndentOutput(true);
        bean.setSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
        bean.afterPropertiesSet();
        ObjectMapper objectMapper = bean.getObject();
        objectMapper.registerModule(new JodaModule());
        return objectMapper;
    }

    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setObjectMapper(objectMapper());
        return converter;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(mappingJackson2HttpMessageConverter());
    }

}
Run Code Online (Sandbox Code Playgroud)


pau*_*lcm 11

我最终使用jackson-datatype-joda工作了:

添加另一个Maven依赖项(匹配您的Jackson版本号):

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-joda</artifactId>
    <version>${jackson.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

然后将JodaModule(处理转换)注册到Jackson的ObjectMapper(这里是在Spring完成的,但你可以创建一个帮助类):

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
    p:targetObject-ref="objectMapper" p:targetMethod="registerModule">
    <property name="arguments">
        <list><bean class="com.fasterxml.jackson.datatype.joda.JodaModule"/></list>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

(您需要为ObjectMapper提供一个id,以便以这种方式引用它).

Hibernate模块也以这种方式注册:https://github.com/FasterXML/jackson-module-hibernate

请注意,您需要设置问题中显示的(简单)DateFormat,但禁用SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS似乎没有任何区别.


小智 11

只是总结答案并在Spring中发布JodaTime序列化的工作解决方案(在Spring 3.2上测试)

弹簧的context.xml

<bean id="objectMapper"
    class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
    p:indentOutput="true" p:simpleDateFormat="yyyy-MM-dd'T'HH:mm:ss.SSSZ">
</bean>
<bean
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
    p:targetObject-ref="objectMapper" p:targetMethod="registerModule">
    <property name="arguments">
        <list>
            <bean class="com.fasterxml.jackson.datatype.joda.JodaModule" />
        </list>
    </property>
</bean>

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
        <bean
            class="org.springframework.http.converter.ResourceHttpMessageConverter" />

        <bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="objectMapper" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
Run Code Online (Sandbox Code Playgroud)

Maven依赖项(com.fasterxml.jackson-version为2.1.1)

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${com.fasterxml.jackson-version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${com.fasterxml.jackson-version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-joda</artifactId>
    <version>${com.fasterxml.jackson-version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

在此之后,ResponseBody中的JodaTime字段将在JSON中自动序列化为"createdDate":"2013-01-18T15:15:36.365 + 02:00"