Spring Boot, укажите точную дату и время в миллисекундах в ответе REST - PullRequest
0 голосов
/ 01 октября 2019

Я создал веб-приложение Spring, которое предлагает REST API. Я использую Spring Boot 2.x, Spring Data REST, Spring HATEOAS, Spring JPA, Hibernate 5.3, Mysql.

Я также использую jackson-datatype-jsr310.

I 'Я работаю с датами UTC во всем приложении, и я храню даты UTC в Mysql.

В моем бине даты определены как:

    @NotNull
    @Column(nullable = false)
    private Instant validUntil;

Все работает, но когда используется APIдаты возвращаются в следующем формате:

"validUntil" : "2019-11-05T22:59:59.999999Z"

Я хочу обрезать каждую дату-время в моем приложении до миллисекунд, поэтому дата должна быть:

"validUntil":"2019-11-05T22: 59: 59.999Z"

В моей @Configuration я использую пользовательский модуль JacksonModule:

    @Bean
    public Module customJacksonModule() {
        SimpleModule customJacksonModule = new SimpleModule();
        customJacksonModule.addSerializer(ConstraintViolationException.class, constraintViolationExceptionSerializer());
        customJacksonModule.addSerializer(ValidationException.class, validationExceptionSerializer());
        customJacksonModule.addSerializer(cloud.optix.server.exceptions.ValidationException.class, customValidationExceptionSerializer());  
        return customJacksonModule;
    }

Я пробовал несколько подходов, но пока никто не работал:

1. Application.properties

Я поставил spring.jackson.serialization.write-date-timestamps-as-nanoseconds = false в моем приложении .properties

2. Пользовательский ObjectMapper

Я пытался изменить настройки objectMapper.

@Autowired(required = true)
public void configureJackson(ObjectMapper jackson2ObjectMapper) {
    jackson2ObjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    jackson2ObjectMapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
}

3. Removed @ EnableHypermediaSupport

@EnableHypermediaSupport(type = {EnableHypermediaSupport.HypermediaType.HAL})

Все эти действия не изменили способ возврата даты клиенту. Я хотел бы получить совет, чтобы понять / отладить, почему дата не возвращается в правильном формате.

В качестве дополнительного примечания я обнаружил, что в com.fasterxml.jackson.datatype.jsr310.ser.InstantSerializerBase в методе serialize () у меня нет ни useNanosecondsсвойство, ни по умолчанию formatter. Однако свойство spring.jackson.serialization.write-dates-as-timestamps в application.properties влияет на формат даты.

enter image description here

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Вы можете настроить свой ObjectMapper для использования определенного формата даты в приложении:

jackson2ObjectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz"));
1 голос
/ 01 октября 2019

Вы пытались просто аннотировать поле validUntil с помощью @JsonFormat, как показано ниже.

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
@NotNull
@Column(nullable = false)
private Instant validUntil;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...