Skip to content

Commit 2c654b2

Browse files
authored
Merge pull request #50938 from geoand/#50932
Add support for `java.time.Period` in Quarkus REST
2 parents 4f32ac6 + bd590f1 commit 2c654b2

File tree

5 files changed

+83
-1
lines changed

5 files changed

+83
-1
lines changed

independent-projects/resteasy-reactive/common/processor/src/main/java/org/jboss/resteasy/reactive/common/processor/EndpointIndexer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.PATH;
4646
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.PATH_PARAM;
4747
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.PATH_SEGMENT;
48+
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.PERIOD;
4849
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.PRIMITIVE_BOOLEAN;
4950
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.PRIMITIVE_CHAR;
5051
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.PRIMITIVE_DOUBLE;
@@ -159,7 +160,7 @@ public abstract class EndpointIndexer<T extends EndpointIndexer<T, PARAM, METHOD
159160
RESOURCE_INFO);
160161

161162
protected static final Set<DotName> SUPPORT_TEMPORAL_PARAMS = Set.of(INSTANT, LOCAL_DATE, LOCAL_TIME, LOCAL_DATE_TIME,
162-
OFFSET_TIME, OFFSET_DATE_TIME, ZONED_DATE_TIME, YEAR, YEAR_MONTH);
163+
OFFSET_TIME, OFFSET_DATE_TIME, ZONED_DATE_TIME, YEAR, YEAR_MONTH, PERIOD);
163164

164165
protected static final Logger log = Logger.getLogger(EndpointIndexer.class);
165166
protected static final String[] EMPTY_STRING_ARRAY = new String[] {};

independent-projects/resteasy-reactive/common/processor/src/main/java/org/jboss/resteasy/reactive/common/processor/ResteasyReactiveDotNames.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.time.LocalTime;
1212
import java.time.OffsetDateTime;
1313
import java.time.OffsetTime;
14+
import java.time.Period;
1415
import java.time.Year;
1516
import java.time.YearMonth;
1617
import java.time.ZonedDateTime;
@@ -207,6 +208,7 @@ public final class ResteasyReactiveDotNames {
207208
public static final DotName ZONED_DATE_TIME = DotName.createSimple(ZonedDateTime.class.getName());
208209
public static final DotName YEAR = DotName.createSimple(Year.class.getName());
209210
public static final DotName YEAR_MONTH = DotName.createSimple(YearMonth.class.getName());
211+
public static final DotName PERIOD = DotName.createSimple(Period.class.getName());
210212

211213
public static final DotName UNI = DotName.createSimple(Uni.class.getName());
212214
public static final DotName MULTI = DotName.createSimple(Multi.class.getName());

independent-projects/resteasy-reactive/server/processor/src/main/java/org/jboss/resteasy/reactive/server/processor/ServerEndpointIndexer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.MULTI_VALUED_MAP;
1919
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.OFFSET_DATE_TIME;
2020
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.OFFSET_TIME;
21+
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.PERIOD;
2122
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.SET;
2223
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.SORTED_SET;
2324
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.YEAR;
@@ -81,6 +82,7 @@
8182
import org.jboss.resteasy.reactive.server.core.parameters.converters.OptionalConverter;
8283
import org.jboss.resteasy.reactive.server.core.parameters.converters.ParameterConverterSupplier;
8384
import org.jboss.resteasy.reactive.server.core.parameters.converters.PathSegmentParamConverter;
85+
import org.jboss.resteasy.reactive.server.core.parameters.converters.PeriodParamConverter;
8486
import org.jboss.resteasy.reactive.server.core.parameters.converters.RuntimeResolvedConverter;
8587
import org.jboss.resteasy.reactive.server.core.parameters.converters.SetConverter;
8688
import org.jboss.resteasy.reactive.server.core.parameters.converters.SortedSetConverter;
@@ -636,6 +638,8 @@ private ParameterConverterSupplier determineTemporalConverter(DotName paramType,
636638
return new YearParamConverter.Supplier(format, dateTimeFormatterProviderClassName);
637639
} else if (YEAR_MONTH.equals(paramType)) {
638640
return new YearMonthParamConverter.Supplier(format, dateTimeFormatterProviderClassName);
641+
} else if (PERIOD.equals(paramType)) {
642+
return new PeriodParamConverter.Supplier();
639643
}
640644

641645
throw new RuntimeException(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.jboss.resteasy.reactive.server.core.parameters.converters;
2+
3+
import java.time.Period;
4+
5+
public class PeriodParamConverter implements ParameterConverter {
6+
7+
@Override
8+
public Object convert(Object value) {
9+
return Period.parse(value.toString());
10+
}
11+
12+
public static final class Supplier implements ParameterConverterSupplier {
13+
14+
@Override
15+
public ParameterConverter get() {
16+
return new PeriodParamConverter();
17+
}
18+
19+
@Override
20+
public String getClassName() {
21+
return PeriodParamConverter.class.getName();
22+
}
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.jboss.resteasy.reactive.server.vertx.test.simple;
2+
3+
import static org.hamcrest.Matchers.equalTo;
4+
5+
import java.time.Period;
6+
7+
import jakarta.ws.rs.GET;
8+
import jakarta.ws.rs.Path;
9+
import jakarta.ws.rs.PathParam;
10+
import jakarta.ws.rs.QueryParam;
11+
12+
import org.jboss.resteasy.reactive.server.vertx.test.framework.ResteasyReactiveUnitTest;
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.extension.RegisterExtension;
15+
16+
import io.restassured.RestAssured;
17+
18+
public class PeriodParamTest {
19+
20+
@RegisterExtension
21+
static ResteasyReactiveUnitTest test = new ResteasyReactiveUnitTest()
22+
.withApplicationRoot((jar) -> jar
23+
.addClasses(PeriodResource.class));
24+
25+
@Test
26+
public void periodAsQueryParam() {
27+
RestAssured.get("/period?value=P1Y2M3D")
28+
.then().statusCode(200).body(equalTo("P1Y2M3D"));
29+
}
30+
31+
@Test
32+
public void periodAsPathParam() {
33+
RestAssured.get("/period/P2Y")
34+
.then().statusCode(200).body(equalTo("P2Y"));
35+
}
36+
37+
@Path("period")
38+
public static class PeriodResource {
39+
40+
@GET
41+
public String query(@QueryParam("value") Period period) {
42+
return period.toString();
43+
}
44+
45+
@GET
46+
@Path("{value}")
47+
public String path(@PathParam("value") Period period) {
48+
return period.toString();
49+
}
50+
}
51+
}

0 commit comments

Comments
 (0)