Springboot 1.5.1 переносится в формат экземпляра 2.0.1 - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу перенести свой проект springboot с 1.5.1 на 2.0.1.

Но формат Instant отличается, когда я возвращаю модель в RestController.

Возвращаемый объект:

public class Message {
     private Instant instant;

}

В 1.5.1:

{
    "instant": {
         "epochSecond": 1537263091,
         "nano": 557000000
    }
}

В 2.0.1:

{
     "instant": "2018-09-18T09:46:02.646Z"
}

Как я могу получить это { "мгновенный": { "epochSecond": 1537263091, "нано": 557000000 } } когда я использую 2.0.1?

1 Ответ

0 голосов
/ 18 сентября 2018

Вы, вероятно, можете установить эту операцию в своем приложении. Properties:

spring.jackson.serialization.write_dates_as_timestamps=false

В процессе миграции, если вы добавили одну из следующих зависимостей, попробуйте удалить ее:

jackson-modules-java8
jackson-datatype-jsr310

[ОБНОВЛЕНО]

Другой способ, вы можете написать сериализатор для Instant:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.time.Instant;

public class CustomInstantSerializer extends JsonSerializer<Instant> {

    @Override
    public void serialize(Instant o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeObject(new EpochInstant(o));
    }

    public static class EpochInstant {

        private final long epochSecond;
        private final int nano;

        EpochInstant(Instant instant) {
            this.epochSecond = instant.getEpochSecond();
            this.nano = instant.getNano();
        }
    }
}

И есть класс Configuration, устанавливающий Instant для использования вашего сериализатора:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.time.Instant;

@Configuration
public class JacksonConfiguration {

    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(Instant.class, new CustomInstantSerializer());

        return objectMapper;
    }
}
...