Итак, я пишу REST API, и один из моих объектов имеет тип java.util.Date;Моя конечная точка POST использует JSON-тип, что-то вроде этого:
{
"authorId": 7845,
"authorName": {
"first": "Dan",
"second": "Brown"
},
"birth": {
"date": "1987-10-25",
"country": "USA",
"city": "New York"
},
"description": "Very good author!"
}
Также я переопределяю метод десериализации Джексона для обработки недопустимого формата даты и всего, что с этим связано:
public class CustomDateDeserializer extends StdDeserializer<LocalDate> {
public CustomDateDeserializer() {
this(null);
}
public CustomDateDeserializer(Class t) {
super(t);
}
@Override
public Date deserialize(JsonParser jp, DeserializationContext dc) throws IOException {
String date = jp.getValueAsString();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate parsed;
try {
parsed = LocalDate.parse(date, formatter);
} catch (DateTimeParseException e) {
throw new InvalidDateTypeException(jp.currentName(), jp.getText());
}
return parsed;
}
}
В моей модели DTOЯ использую именно этот десериализатор для этого параметра:
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonDeserialize(using = CustomDateDeserializer.class)
@PastOrPresent(message = "Value 'date' must be past or present!")
private LocalDate date;
При жизни всех моих промежуточных объектов (моделей и DTO) это значение везде выглядит так, как во входных данных JSON - 1987-10-25.
Контроллер:
@PostMapping(value = "/author/new", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> addNewAuthor(@RequestBody @Valid AuthorPostDto postAuthor) {
AuthorPostDto response = authorService.addNewAuthor(postAuthor);
return new ResponseEntity<>(response, HttpStatus.CREATED);
}
Метод обслуживания:
public AuthorPostDto addNewAuthor(AuthorPostDto author) {
if (authorRepository.existsByAuthorId(author.getAuthorId())) {
throw new AuthorAlreadyExistsException();
}
Author toPost = toModelMapper.mapAuthorDtoToAuthor(author);
Author response = authorRepository.save(toPost);
return toDtoMapper.mapAuthorModelToDto_POST(response);
}
Все объекты - postAuthor (проанализированный Джексоном в контроллере), toPost, ответ и возвращаемое значение из сервиса - содержит значение Date, как вinput JSON - 1987-10-25.
Но в SQL и в возвращаемом значении из контроллера появляется дата, указанная накануне: 1987-10-24 ...
Как это исправить?