snowdrop-zen / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
1 stars 0 forks source link

Cannot use UriInfo context in resteasy-reactive `@ServerResponseFilter` #458

Closed snowdrop-bot closed 2 years ago

snowdrop-bot commented 2 years ago

Describe the bug

According to the RESTeasy Reactive guide, filter parameters can take any context object. However, declaring UriInfo as a parameter in a response filter results in a runtime error. (This happens for a few other context objects.)

It seems that UriInfo is a valid parameter for getRequestFilterResultHandles but not for getResponseFilterResultHandles. https://github.com/quarkusio/quarkus/blob/4757a61b87556c456724ef63f9b8fd8068b8eacd/independent-projects/resteasy-reactive/server/processor/src/main/java/org/jboss/resteasy/reactive/server/processor/generation/filters/CustomFilterGenerator.java#L289-L293

I'm not sure if this is a documentation or implementation issue.

Expected behavior

It's possible to access UriInfo in a response filter with ContainerRequestContext#getUriInfo(). Ideally, response filters could directly declare UriInfo without error.

Actual behavior

Caused by: java.lang.RuntimeException: Parameter 'uriInfo' of method 'getFilter of class 'org.acme.Filters' is not allowed
        at io.quarkus.resteasy.reactive.server.deployment.CustomFilterGenerator.getResponseFilterResultHandles(CustomFilterGenerator.java:511)
        at io.quarkus.resteasy.reactive.server.deployment.CustomFilterGenerator.generateStandardContainerResponseFilter(CustomFilterGenerator.java:424)
        at io.quarkus.resteasy.reactive.server.deployment.CustomFilterGenerator.generateContainerResponseFilter(CustomFilterGenerator.java:336)
        at io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor.handleCustomAnnotatedMethods(ResteasyReactiveScanningProcessor.java:369)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:887)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
        at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
        at java.base/java.lang.Thread.run(Thread.java:829)
        at org.jboss.threads.JBossThread.run(JBossThread.java:501)

How to Reproduce?

Create a filter class which declares javax.ws.rs.core.UriInfo as a parameter.

package org.acme;

import org.jboss.resteasy.reactive.server.ServerResponseFilter;

import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.core.UriInfo;

class Filters{
    @ServerResponseFilter
    public void getFilter(ContainerResponseContext responseContext, UriInfo uriInfo) {
        System.out.println("Request path is: " + uriInfo.getRequestUri().toString());
    }
}

Output of uname -a or ver

No response

Output of java -version

No response

GraalVM version (if different from Java)

No response

Quarkus version or git rev

2.5.1.Final

Build tool (ie. output of mvnw --version or gradlew --version)

No response

Additional information

No response


https://github.com/quarkusio/quarkus/issues/21956


$upstream:21956$