Spring RestController: пользовательский формат даты для java.time.LocalDate не работает - PullRequest
0 голосов
/ 09 октября 2019

Я хотел бы изменить формат даты по умолчанию для сериализатора JSON в моем приложении Spring-boot. Кажется, я что-то упустил, потому что ни один из следующих методов не может работать для меня: 5 способов настройки вывода JSON / XML Spring MVC

Среда:

  • Java 11
  • Spring boot: 2.1.6.RELEASE

Мои соответствующие зависимости:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
</dependency>
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.10.0</version>
</dependency>

POJO:

@Data
@NoArgsConstructor
public class User {

    ...

    @ApiModelProperty(example = "2019/01/01", notes = "date of birth as YYYY/MM/DD")
    @Past(message = "Are you really from the future?")
    private LocalDate dateOfBirth;
}

Конфигурация пружины:

@Configuration
public class OutputConfiguration {

    private static final String PATTERN = "yyyy/MM/dd";

    @Bean
    @Primary
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        objectMapper.setDateFormat(new SimpleDateFormat(pattern));
        return objectMapper;
    }
}

Если я добавлю @JsonFormat(pattern="yyyy/MM/dd") в POJO, перед LocalDate переменная, тогда все работает нормально. Но поскольку у меня много LocalDate переменных, я хотел бы добавить эту конфигурацию на уровень приложения.

Это ошибка, которую я получаю:

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.time.LocalDate` from String "2019/05/29": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '2019/05/29' could not be parsed at index 4; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDate` from String "2019/05/29": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '2019/05/29' could not be parsed at index 4
 at [Source: (PushbackInputStream); line: 2, column: 18] (through reference chain: com.remal.gombi.component.domain.User["dateOfBirth"])

Что я делаю не так?

ОБНОВЛЕНИЕ

Если я добавлю следующую конфигурацию, запрос GET rest возвращается с правильно отформатированным LocalDate: "dateOfBirth": "29/05/2019", НОметод POST все еще ожидает формат даты ISO: "dateOfBirth": "2019-01-01". Это так странно.

@Bean
public Jackson2ObjectMapperBuilder customJacksonMapper() {
    return new Jackson2ObjectMapperBuilder()
            .indentOutput(true)
            .serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_PATTERN)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...