Spring Boot изменяет формат даты поля параметра запроса как DTO - PullRequest
2 голосов
/ 04 февраля 2020

Мой контроллер имеет конечную точку GET, которая принимает множество параметров запроса. Таким образом, вместо нескольких @QueryParam я создал CriteriaDTO для выполнения динамических c запросов к нашей базе данных Mon go

Моя конечная точка контроллера:

@GetMapping
public List<MyObject> getAll(@Valid CriteriaDTO criteriaDTO){
    return myObjectService.findAll(criteriaDTO);
} 

public class CriteriaDTO {

    private int offset = 0
    private int limit = 20
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate minDate

    // getters, setters ...
}

И я хочу передать minDate - это URL со следующим форматом yyyy-MM-dd, но мне нужно преобразовать его в следующий формат yyyy-MM-dd'T'HH:mm:ss.SSS.

Мой вопрос: есть ли аннотации или что-то еще, что принимает первый формат yyyy-MM-dd и автоматически конвертирует его в другой?

Чтобы было ясно, если я сделаю следующий звонок:

http://localhost:8080/api/myobject?minDate=2020-01-01

И тогда criteriaDTO.getminDate() вернется 2020-01-01'T'00:00:00.000

Спасибо за ваше помощь:)

Ответы [ 4 ]

1 голос
/ 04 февраля 2020

У вас есть несколько вариантов. Проверьте, что именно вам нужно,

    LocalDate date = LocalDate.now();

    LocalDateTime dateTime = LocalDateTime.of(date, LocalTime.MIDNIGHT);
    System.out.println(dateTime); //2020-02-04T00:00:00

    System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(dateTime)); //2020-02-04T00:00:00

    System.out.println(date.atStartOfDay()); ////2020-02-04T00:00

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
    System.out.println(formatter.format(dateTime)); //2020-02-04T00:00:00.000

Вам необходимо изменить геттер в dto для его форматирования, например:

class CriteriaDTO {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");

    private int offset = 0
    private int limit = 20
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate minDate

    public String getMinDate() {
        return formatter.format(LocalDateTime.of(minDate, LocalTime.MIDNIGHT));
    }

    // getters, setters ...
}
1 голос
/ 04 февраля 2020

Я бы рекомендовал использовать atStartOfDay вместо преобразования этого 2020-01-01 в 2020-01-01'T'00:00:00.000 с помощью пользовательского десериализатора. А также, поскольку вы управляете входными данными, я бы порекомендовал сделать это как отдельную операцию

LocalDateTime date = criteriaDTO.getminDate().atStartOfDay()  //2020-01-01'T'00:00

И вы также можете добавить форматер DateTimeFormatter , чтобы получить требуемый вывод

date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) //2020-01-01'T'00:00:00
1 голос
/ 04 февраля 2020

Определение установщика и анализ с помощью SimpleDateFormat

public void setMinDate() {
    if(!minDate.empty()) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
        this.minDate = formatter.parse(minDate)
    }

}
1 голос
/ 04 февраля 2020

Вы можете сделать это более простым способом, чем поиск решения annotation-magi c.

Просто добавьте в свой CriteriaDTO дополнительный метод получения LocalDateTime:

public LocalDateTime getMinDateTime() {
    return this.minDate.atTime(0, 0, 0, 0);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...