Я хотел бы изменить формат даты по умолчанию для сериализатора 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)));
}