Непоследовательный результат сериализации 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 или Джексона?

Ответы на вопрос(0)

Ваш ответ на вопрос