Pierre Jones
Pierre Jones

Reputation: 662

Spring Boot change date format of request param field as DTO

My controller has a GET endpoint which accept lots of query parameters. So, instead of having multiple @QueryParam I created a CriteriaDTO in order to perform dynamic queries to our Mongo database

My controller endpoint :

@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 ...
}

And, I want to pass the minDate is the URL with the following format yyyy-MM-dd but I need to convert it to the following format yyyy-MM-dd'T'HH:mm:ss.SSS.

My question is : Is there any annotation or something else which accepts the first format yyyy-MM-dd and automatically convert it to another ?

To be clear if I make the following call :

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

And then criteriaDTO.getminDate() will return 2020-01-01'T'00:00:00.000

Thanks for your help :)

Upvotes: 2

Views: 16818

Answers (4)

Shafiul
Shafiul

Reputation: 1512

You have several options. Check what you exactly need,

    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

You need to modify the getter in dto to format it, for example:

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 ...
}

Upvotes: 1

Ryuzaki L
Ryuzaki L

Reputation: 40058

I would recommend to use atStartOfDay instead of converting this 2020-01-01 to 2020-01-01'T'00:00:00.000 using custom deserializer. And also since you are manipulating the input data i would recommend to do it as separate operation

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

And you can also add formatter DateTimeFormatter to get required output

date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) //2020-01-01'T'00:00:00

Upvotes: 1

Vishnu Atrai
Vishnu Atrai

Reputation: 2368

Define setter and parse with SimpleDateFormat

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

}

Upvotes: 1

Diarsid
Diarsid

Reputation: 96

You can do it in a more simple way than searching an annotation-magic solution.

Just add to your CriteriaDTO an additional getter for LocalDateTime:

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

and use it wherever you need time instead of date.

Upvotes: 1

Related Questions