Skip to content

Commit e75b0fd

Browse files
authored
Merge pull request #45672 from lasteris/docs-rest-client-fix-link
Support java.util.Optional<T> passing to @QueryParam/@restquery for RestСlient
2 parents 552322f + 4036dab commit e75b0fd

File tree

4 files changed

+90
-0
lines changed

4 files changed

+90
-0
lines changed

docs/src/main/asciidoc/rest-client.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ import jakarta.ws.rs.QueryParam;
157157
import jakarta.ws.rs.core.MultivaluedMap;
158158
import java.util.Map;
159159
import java.util.Set;
160+
import java util.Optional;
160161
161162
@Path("/extensions")
162163
@RegisterRestClient(configKey = "extensions-api")
@@ -168,6 +169,9 @@ public interface ExtensionsService {
168169
@GET
169170
Set<Extension> getByName(@RestQuery String name); <1>
170171
172+
@GET
173+
Set<Extension> getByOptionalName(@RestQuery Optional<String> name);
174+
171175
@GET
172176
Set<Extension> getByFilter(@RestQuery Map<String, String> filter); <2>
173177

extensions/resteasy-reactive/rest-client-jaxrs/deployment/src/main/java/io/quarkus/jaxrs/client/reactive/deployment/JaxrsClientReactiveProcessor.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.MAP;
1818
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.MULTI;
1919
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.OBJECT;
20+
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.OPTIONAL;
2021
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.PART_TYPE_NAME;
2122
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.REST_FORM_PARAM;
2223
import static org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames.REST_MULTI;
@@ -2861,6 +2862,19 @@ private ResultHandle addQueryParam(MethodInfo jandexMethod, BytecodeCreator meth
28612862
paramArray = notNullParam.invokeStaticMethod(
28622863
MethodDescriptor.ofMethod(ToObjectArray.class, "collection", Object[].class, Collection.class),
28632864
queryParamHandle);
2865+
} else if (isOptional(type, index)) {
2866+
if (type.kind() == PARAMETERIZED_TYPE) {
2867+
Type paramType = type.asParameterizedType().arguments().get(0);
2868+
if ((paramType.kind() == CLASS) || (paramType.kind() == PARAMETERIZED_TYPE)) {
2869+
componentType = paramType.name().toString();
2870+
}
2871+
}
2872+
if (componentType == null) {
2873+
componentType = DotNames.OBJECT.toString();
2874+
}
2875+
paramArray = notNullParam.invokeStaticMethod(
2876+
MethodDescriptor.ofMethod(ToObjectArray.class, "optional", Object[].class, Optional.class),
2877+
queryParamHandle);
28642878
} else {
28652879
componentType = type.name().toString();
28662880
paramArray = notNullParam.invokeStaticMethod(
@@ -2930,6 +2944,10 @@ private boolean isMap(Type type, IndexView index) {
29302944
return isAssignableFrom(MAP, type.name(), index);
29312945
}
29322946

2947+
private boolean isOptional(Type type, IndexView index) {
2948+
return isAssignableFrom(OPTIONAL, type.name(), index);
2949+
}
2950+
29332951
private void addHeaderParam(BytecodeCreator invoBuilderEnricher, AssignableResultHandle invocationBuilder,
29342952
String paramName, ResultHandle headerParamHandle, String paramType, ResultHandle client,
29352953
ResultHandle genericType, ResultHandle annotations) {

extensions/resteasy-reactive/rest-client-jaxrs/runtime/src/main/java/io/quarkus/jaxrs/client/reactive/runtime/ToObjectArray.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.quarkus.jaxrs.client.reactive.runtime;
22

33
import java.util.Collection;
4+
import java.util.Optional;
45

56
/**
67
* used by query param handling mechanism, in generated code
@@ -16,6 +17,10 @@ public static Object[] value(Object value) {
1617
return new Object[] { value };
1718
}
1819

20+
public static Object[] optional(Optional<?> optional) {
21+
return optional.isPresent() ? new Object[] { optional.get() } : new Object[] {};
22+
}
23+
1924
private ToObjectArray() {
2025
}
2126
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package io.quarkus.rest.client.reactive;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.net.URI;
6+
import java.util.*;
7+
8+
import jakarta.ws.rs.GET;
9+
import jakarta.ws.rs.Path;
10+
import jakarta.ws.rs.core.Context;
11+
import jakarta.ws.rs.core.UriInfo;
12+
13+
import org.jboss.resteasy.reactive.RestQuery;
14+
import org.junit.jupiter.api.Test;
15+
import org.junit.jupiter.api.extension.RegisterExtension;
16+
17+
import io.quarkus.test.QuarkusUnitTest;
18+
import io.quarkus.test.common.http.TestHTTPResource;
19+
20+
public class OptionalQueryParamsTest {
21+
22+
@RegisterExtension
23+
static final QuarkusUnitTest config = new QuarkusUnitTest()
24+
.withApplicationRoot((jar) -> jar.addClasses(Resource.class, Client.class));
25+
26+
@TestHTTPResource
27+
URI baseUri;
28+
29+
@Test
30+
void testQueryParamsWithOptionals() {
31+
Client client = QuarkusRestClientBuilder.newBuilder().baseUri(baseUri).build(Client.class);
32+
String responseForEmptyOptional = client.optional(Optional.empty());
33+
assertThat(responseForEmptyOptional).isNullOrEmpty();
34+
35+
String responseForValueOptional = client.optional(Optional.of("value"));
36+
assertThat(responseForValueOptional).isEqualTo("parameter=value");
37+
}
38+
39+
@Path("optional")
40+
public static class Resource {
41+
42+
@Path("query")
43+
@GET
44+
public String queryParams(@Context UriInfo uriInfo) {
45+
46+
var entries = new ArrayList<String>(uriInfo.getQueryParameters().size());
47+
for (var entry : uriInfo.getQueryParameters().entrySet()) {
48+
entries.add(entry.getKey() + "=" + String.join(",", entry.getValue()));
49+
}
50+
return String.join(";", entries);
51+
52+
}
53+
}
54+
55+
@Path("optional")
56+
public interface Client {
57+
58+
@Path("query")
59+
@GET
60+
String optional(@RestQuery Optional<String> parameter);
61+
62+
}
63+
}

0 commit comments

Comments
 (0)