web-dev-qa-db-ja.com

スプリングブートJoda DateTimeシリアル化

Spring Boot v1.2.0.BUILD-SNAPSHOTを使用してJoda DateTimeプロパティをISO-8601としてシリアル化しようとしています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はタイムスタンプとしてシリアル化されます。 {"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ビルドに次の依存関係のみを追加しました

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");
16
edge66

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;
}
20
Phil Webb

Spring Boot 1.2では、ObjectMapperインスタンスの構築に流暢な builder を使用できます。

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

JodaModuleについては、com.fasterxml.jackson.datatype:jackson-datatype-jodaはクラスパス上にあります。

7
tadaskay

これをリソースのapplication.*に追加します。 (私はyamelを使用しているので、私にとっては.ymlですが、デフォルトでは.propertiesになるはずです)

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

またはあなたが望むどんなフォーマットでも。

4
Tyler

オブジェクトマッパーのコンストラクターにnew JodaModule()を渡します。

InfoメソッドにISOパターンで注釈を付ける

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")

または春を使用している場合はこれを使用できると思います

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateTimeFormat.ISO.DATE_TIME)
4
tom

Joda-date-time-formatプロパティもあります(このプロパティはSpring boot 1.3.xバージョンで初めて登場したと思います)は、jacksonのシリアル化/逆シリアル化で機能するapplication.propertiesで設定できます。

送信元: 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

Joda時間のドキュメント( http://joda-time.sourceforge.net/apidocs/org/joda)から、タイムゾーンIDまたはオフセット時間の表示方法を変更する「Z」の数を変えることができます/time/format/DateTimeFormat.html ):

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