docs
reference
tessl install tessl/maven-io-quarkus--quarkus-resteasy-reactive@3.15.0A Jakarta REST implementation utilizing build time processing and Vert.x for high-performance REST endpoints with reactive capabilities in cloud-native environments.
Quarkus REST provides the @DateFormat annotation for custom date format patterns on temporal type parameters.
import org.jboss.resteasy.reactive.DateFormat;
import java.time.*;Specifies a custom date format pattern for temporal type parameters.
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface DateFormat {
String pattern() default ""; // Date format pattern
String dateTimeFormatterProviderClassName() default ""; // Custom formatter provider
}LocalDateLocalDateTimeLocalTimeOffsetDateTimeOffsetTimeZonedDateTime@GET
@Path("/events")
public List<Event> getEvents(
@RestQuery
@DateFormat(pattern = "yyyy-MM-dd")
LocalDate startDate,
@RestQuery
@DateFormat(pattern = "yyyy-MM-dd")
LocalDate endDate
) {
return eventService.findBetween(startDate, endDate);
}
// Request: /events?startDate=2024-01-15&endDate=2024-01-31@GET
@Path("/logs")
public List<LogEntry> getLogs(
@RestQuery
@DateFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime since
) {
return logService.findSince(since);
}
// Request: /logs?since=2024-01-15T10:30:00@GET
@Path("/schedule")
public List<Task> getSchedule(
@RestQuery
@DateFormat(pattern = "HH:mm")
LocalTime startTime,
@RestQuery
@DateFormat(pattern = "HH:mm")
LocalTime endTime
) {
return scheduleService.findBetween(startTime, endTime);
}
// Request: /schedule?startTime=09:00&endTime=17:00@GET
@Path("/appointments")
public List<Appointment> getAppointments(
@RestQuery
@DateFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
ZonedDateTime dateTime
) {
return appointmentService.findAt(dateTime);
}
// Request: /appointments?dateTime=2024-01-15T10:30:00-05:00@GET
@Path("/records")
public List<Record> getRecords(
@RestQuery
@DateFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
OffsetDateTime timestamp
) {
return recordService.findAt(timestamp);
}
// Request: /records?timestamp=2024-01-15T10:30:00-0500| Pattern | Example | Description |
|---|---|---|
yyyy-MM-dd | 2024-01-15 | ISO date |
MM/dd/yyyy | 01/15/2024 | US date format |
dd/MM/yyyy | 15/01/2024 | European date format |
yyyy-MM-dd'T'HH:mm:ss | 2024-01-15T10:30:00 | ISO date-time |
yyyy-MM-dd HH:mm:ss | 2024-01-15 10:30:00 | Date-time with space |
HH:mm | 10:30 | 24-hour time |
hh:mm a | 10:30 AM | 12-hour time |
yyyy-MM-dd'T'HH:mm:ssXXX | 2024-01-15T10:30:00-05:00 | ISO with timezone |
yyyy-MM-dd'T'HH:mm:ssZ | 2024-01-15T10:30:00-0500 | RFC 822 timezone |
Works with all parameter binding annotations:
@GET
@Path("/{date}")
public Report getReport(
@RestPath
@DateFormat(pattern = "yyyy-MM-dd")
LocalDate date
) {
return reportService.getForDate(date);
}
// Request: /reports/2024-01-15
@GET
public Response get(
@RestHeader("X-Date")
@DateFormat(pattern = "yyyy-MM-dd")
LocalDate date
) {
return Response.ok().build();
}
// Header: X-Date: 2024-01-15Without @DateFormat, temporal parameters use ISO-8601 format:
@GET
public List<Event> getEvents(
@RestQuery LocalDate date // Expects ISO format: 2024-01-15
) {
return eventService.findByDate(date);
}Invalid date formats result in 400 Bad Request:
@GET
public List<Event> getEvents(
@RestQuery
@DateFormat(pattern = "yyyy-MM-dd")
LocalDate date
) {
return eventService.findByDate(date);
}
// Valid: /events?date=2024-01-15
// Invalid: /events?date=01/15/2024 -> 400 Bad Request
// Invalid: /events?date=invalid -> 400 Bad RequestCombine with Optional for optional date parameters:
@GET
public List<Event> getEvents(
@RestQuery
@DateFormat(pattern = "yyyy-MM-dd")
Optional<LocalDate> startDate,
@RestQuery
@DateFormat(pattern = "yyyy-MM-dd")
Optional<LocalDate> endDate
) {
LocalDate start = startDate.orElse(LocalDate.now().minusDays(30));
LocalDate end = endDate.orElse(LocalDate.now());
return eventService.findBetween(start, end);
}
// All valid:
// /events
// /events?startDate=2024-01-01
// /events?startDate=2024-01-01&endDate=2024-01-31For advanced formatting needs, provide a custom DateTimeFormatterProvider:
public class CustomDateTimeFormatterProvider implements DateTimeFormatterProvider {
@Override
public DateTimeFormatter get() {
return DateTimeFormatter.ofPattern("yyyy-MM-dd")
.withResolverStyle(ResolverStyle.STRICT);
}
}
@GET
public List<Event> getEvents(
@RestQuery
@DateFormat(dateTimeFormatterProviderClassName = "com.example.CustomDateTimeFormatterProvider")
LocalDate date
) {
return eventService.findByDate(date);
}