or run

tessl search
Log in

Version

Workspace
tessl
Visibility
Public
Created
Last updated
Describes
mavenpkg:maven/io.quarkus/quarkus-resteasy-reactive@3.15.x

docs

index.md
tile.json

tessl/maven-io-quarkus--quarkus-resteasy-reactive

tessl install tessl/maven-io-quarkus--quarkus-resteasy-reactive@3.15.0

A Jakarta REST implementation utilizing build time processing and Vert.x for high-performance REST endpoints with reactive capabilities in cloud-native environments.

date-formatting.mddocs/reference/

Date Formatting

Quarkus REST provides the @DateFormat annotation for custom date format patterns on temporal type parameters.

Import

import org.jboss.resteasy.reactive.DateFormat;
import java.time.*;

@DateFormat

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
}

Supported Temporal Types

  • LocalDate
  • LocalDateTime
  • LocalTime
  • OffsetDateTime
  • OffsetTime
  • ZonedDateTime

Usage

Date Format

@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

Date-Time Format

@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

Time Format

@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

Zoned Date-Time Format

@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

Offset Date-Time Format

@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

Common Format Patterns

PatternExampleDescription
yyyy-MM-dd2024-01-15ISO date
MM/dd/yyyy01/15/2024US date format
dd/MM/yyyy15/01/2024European date format
yyyy-MM-dd'T'HH:mm:ss2024-01-15T10:30:00ISO date-time
yyyy-MM-dd HH:mm:ss2024-01-15 10:30:00Date-time with space
HH:mm10:3024-hour time
hh:mm a10:30 AM12-hour time
yyyy-MM-dd'T'HH:mm:ssXXX2024-01-15T10:30:00-05:00ISO with timezone
yyyy-MM-dd'T'HH:mm:ssZ2024-01-15T10:30:00-0500RFC 822 timezone

Path and Header Parameters

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-15

Default Format (Without Annotation)

Without @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);
}

Error Handling

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 Request

Optional Dates

Combine 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-31

Custom Formatter Provider

For 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);
}