Skip to content

Commit

Permalink
Make sure bean params are @Typed correctly for CDI lookup in case o…
Browse files Browse the repository at this point in the history
…f subtyping

Fixes #29227
  • Loading branch information
FroMage committed Nov 22, 2022
1 parent 3c5e064 commit 433a289
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -730,7 +730,7 @@ private FilterClassIntrospector createFilterClassIntrospector() {
return ab.get();
}

// We want to add @Typed to resources and providers so that they can be resolved as CDI bean using purely their
// We want to add @Typed to resources, beanparams and providers so that they can be resolved as CDI bean using purely their
// class as a bean type. This removes any ambiguity that potential subclasses may have.
@BuildStep
public void transformEndpoints(
Expand All @@ -744,6 +744,10 @@ public void transformEndpoints(
allResources.addAll(resourceScanningResultBuildItem.getResult().getScannedResources().keySet());
allResources.addAll(resourceScanningResultBuildItem.getResult().getPossibleSubResources().keySet());

// all found bean params
Set<String> beanParams = resourceScanningResultBuildItem.getResult()
.getBeanParams();

// discovered filters and interceptors
Set<String> filtersAndInterceptors = new HashSet<>();
InterceptorContainer<ReaderInterceptor> readerInterceptors = resourceInterceptorsBuildItem.getResourceInterceptors()
Expand Down Expand Up @@ -788,6 +792,14 @@ public void transform(TransformationContext context) {
&& clazz.declaredAnnotation(ResteasyReactiveDotNames.TYPED) == null) {
// Add @Typed(MyResource.class)
context.transform().add(createTypedAnnotationInstance(clazz, beanArchiveIndexBuildItem)).done();
return;
}
// check if the class is a bean param
if (beanParams.contains(clazz.name().toString())
&& clazz.declaredAnnotation(ResteasyReactiveDotNames.TYPED) == null) {
// Add @Typed(MyBean.class)
context.transform().add(createTypedAnnotationInstance(clazz, beanArchiveIndexBuildItem)).done();
return;
}
}
}));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package io.quarkus.resteasy.reactive.server.test.beanparam;

import javax.ws.rs.BeanParam;
import javax.ws.rs.CookieParam;
import javax.ws.rs.FormParam;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.test.QuarkusUnitTest;

public class BeanParamTest {
@RegisterExtension
static final QuarkusUnitTest TEST = new QuarkusUnitTest()
.setArchiveProducer(() -> {
return ShrinkWrap.create(JavaArchive.class)
.addClasses(MyBeanParamWithFieldsAndProperties.class, Top.class);
});

@Test
void shouldDeployWithoutIssues() {
// we only need to check that it deploys
}

public static class Top {
@PathParam("pathParam")
private String pathParam = "pathParam";

public String getPathParam() {
return pathParam;
}

public void setPathParam(String pathParam) {
this.pathParam = pathParam;
}
}

public static class MyBeanParamWithFieldsAndProperties extends Top {
@HeaderParam("headerParam")
private String headerParam = "headerParam";
@CookieParam("cookieParam")
private String cookieParam = "cookieParam";
@FormParam("formParam")
private String formParam = "formParam";
@QueryParam("queryParam")
private String queryParam = "queryParam";

// FIXME: Matrix not supported

public String getHeaderParam() {
return headerParam;
}

public void setHeaderParam(String headerParam) {
this.headerParam = headerParam;
}

public String getCookieParam() {
return cookieParam;
}

public void setCookieParam(String cookieParam) {
this.cookieParam = cookieParam;
}

public String getFormParam() {
return formParam;
}

public void setFormParam(String formParam) {
this.formParam = formParam;
}

public String getQueryParam() {
return queryParam;
}

public void setQueryParam(String queryParam) {
this.queryParam = queryParam;
}
}

@Path("/")
public static class Resource {
@Path("/a/{restPathDefault}/{restPath_Overridden}/{pathParam}")
@POST
public String beanParamWithFields(@BeanParam MyBeanParamWithFieldsAndProperties p) {
return null;
}

@Path("/b/{pathParam}")
@POST
public String beanParamWithFields(@BeanParam Top p) {
return null;
}
}
}

0 comments on commit 433a289

Please sign in to comment.