Непоследовательный результат сериализации org.joda.time.DateTime при загрузке Spring с 1.3.X до 1.4.0
После обновления Spring Boot с версии 1.3.3 до 1.4.0 я заметил изменение поведения при сериализации org.joda.time.DateTime.
Давайте создадим простой Spring boot + Maven Project.
Зависимости pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.7.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
</dependency>
<dependencies>
Доменный объект:
@Document(collection="items")
@TypeAlias("item")
public class Item {
@Id
private String id;
private DateTime date;
/* getters/setters omitted */
}
Репозиторий:
public interface ItemRepository extends MongoRepository<Item, String>{}
Теперь, если я получу какой-либо ресурс предмета, я получу следующий результат:
{
"_embedded" : {
"items" : [ {
"id" : "57bf084a452105f14763cce7",
"date" : "1970-01-01T00:00:00.000Z",
"_links" : {
"self" : {
"href" : "http://localhost:8082/items/57bf084a452105f14763cce7"
},
"item" : {
"href" : "http://localhost:8082/items/57bf084a452105f14763cce7"
}
}
} ]
},
/* omitted links and meta data */
}
Что хорошо.
Теперь, если я обновлю Spring Boot до 1.4.0.RELEASE, не затрагивая ничего в моей кодовой базе, я получу следующее:
{
"_embedded" : {
"items" : [ {
"id" : "57bf084a452105f14763cce7",
"date" : {
"content" : "1970-01-01T00:00:00.000Z"
},
"_links" : {
"self" : {
"href" : "http://localhost:8082/items/57bf084a452105f14763cce7"
},
"item" : {
"href" : "http://localhost:8082/items/57bf084a452105f14763cce7"
}
}
} ]
},
/* links and metadata omitted */
}
Дата и время теперь сериализуются как{"content": "1970-01-01T00: 00: 00.000Z"} вместо"1970-01-01T00: 00: 00.000Z"
Эта проблема легко решается путем аннотирования поля DateTime с помощью @JsonFormat:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private DateTime date;
На самом деле, я не люблю использовать @JsonFormat. Вместо этого я использую пользовательский Jackson2ObjectMapperBuilder (он позволяет мне обрабатывать другие мои сериализаторы и десериализаторы, вручную или через @JsonComponent ...)
@Configuration
public class JacksonConfiguration {
@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.serializerByType(DateTime.class, new DateTimeSerializer());
return builder;
}
}
Плохие новости, я все равно получаю тот же результат. Я пытался с пользовательским сериализатором, я все еще получаю ключ "содержимого" в пути. Только с помощьюcom.fasterxml.jackson.databind.ser.std.ToStringSerializer вместоcom.fasterxml.jackson.datatype.joda.ser.DateTimeSerializer могу ли я (почти) получить то, что хочу:
{
"_embedded" : {
"items" : [ {
"id" : "57bf084a452105f14763cce7",
"date" : "1970-01-01T01:00:00.000+01:00",
"_links" : {
"self" : {
"href" : "http://localhost:8082/items/57bf084a452105f14763cce7"
},
"item" : {
"href" : "http://localhost:8082/items/57bf084a452105f14763cce7"
}
}
} ]
},
/* links and metadata omitted */
}
В двух словах, что происходит? Откуда этот дополнительный «контентный» ключ и должен ли он там быть? Я хотел бы сообщить об этой ошибке, но я не знаю, кого это касается, разработчиков из Spring Boot или Джексона?