春天启动Joda DateTime序列化

时间:2014-11-14 09:01:21

标签: datetime jackson jodatime spring-boot iso8601

我尝试使用Spring Boot v1.2.0将Joda DateTime属性序列化为ISO-8601 .BUILD-SNAPSHOT 这是我非常简单的REST应用程序。

@RestController
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    class Info{

       private DateTime dateTime;

        public Info(){
            dateTime = new DateTime();
        }
        public DateTime getDateTime() {
           return dateTime;
        }

        public void setDateTime(DateTime dateTime) {
           this.dateTime = dateTime;
        }
    }

    @RequestMapping("/info")
    Info info() {
        return new Info();
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
   public Module getModule(){
        return new JodaModule();
   }
}

将dateTime序列化为时间戳,例如{"日期时间":1415954873412} 我尝试过添加

    @Bean
    @Primary
    public ObjectMapper getObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
                false);
        return objectMapper;
    }

但这也没有帮助。那么如何在Spring Boot中配置jackson以使用ISO-8601格式进行序列化? 顺便说一句:我只在gradle build

中添加了以下依赖项
compile("joda-time:joda-time:2.4")
compile("org.jadira.usertype:usertype.jodatime:2.0.1")
compile("com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.2");

5 个答案:

答案 0 :(得分:20)

由于您使用的是Spring Boot 1.2,因此您只需将以下内容添加到application.properties文件中即可:

spring.jackson.serialization.write_dates_as_timestamps=false

这将以以下形式提供输出:

{
    "dateTime": "2014-11-18T19:01:38.352Z"
}

如果您需要自定义格式,可以直接配置JodaModule,例如删除时间部分:

@Bean
public JodaModule jacksonJodaModule() {
    JodaModule module = new JodaModule();
    DateTimeFormatterFactory formatterFactory = new DateTimeFormatterFactory();
    formatterFactory.setIso(ISO.DATE);
    module.addSerializer(DateTime.class, new DateTimeSerializer(
        new JacksonJodaFormat(formatterFactory.createDateTimeFormatter()
            .withZoneUTC())));
    return module;
}

答案 1 :(得分:7)

使用Spring Boot 1.2,您可以使用流畅的builder来构建ObjectMapper实例:

@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    return builder
              .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
              .build();
}

至于JodaModule,当com.fasterxml.jackson.datatype:jackson-datatype-joda在类路径上时,它将自动配置。

答案 2 :(得分:4)

new JodaModule()传递给对象映射器的构造函数。

使用ISO模式

注释您的Info方法
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")

或者我认为如果你使用弹簧

就可以使用它
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateTimeFormat.ISO.DATE_TIME)

答案 3 :(得分:3)

将此内容添加到资源中的application.*。 (我使用yamel所以它.yml对我来说,但默认情况下应为.properties

spring.jackson.date-format: yyyy-MM-dd'T'HH:mm:ssZ

或者你想要的任何格式。

答案 4 :(得分:0)

还有一个joda-date-time-format属性(我认为这个属性首次出现在Spring boot 1.3.x版本中),您可以在application.properties中设置这些属性,这将适用于jackson序列化/反序列化:

来自:https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.jackson.joda-date-time-format= # Joda date time format string. If not configured, "date-format" will be used as a fallback if it is configured with a format string.

因此,如果您想使用ISO格式,可以这样设置:

spring.jackson.joda-date-time-format=yyyy-MM-dd'T'HH:mm:ss.SSSZ

你可以有不同数量的' Z'从joda时间文档(http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html)更改时区ID或偏移小时的显示方式:

Zone: 'Z' outputs offset without a colon, 'ZZ' outputs the offset with a colon, 'ZZZ' or more outputs the zone id.