Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rest Client Reactive: globally register providers annotated with @Provider #18957

Conversation

michalszynkiewicz
Copy link
Member

@michalszynkiewicz michalszynkiewicz commented Jul 23, 2021

fixes #18560

This change also adds support for sorting providers by @Priority

@@ -217,14 +213,34 @@ void registerProvidersFromAnnotations(CombinedIndexBuildItem indexBuildItem,
constructor.invokeSpecialMethod(MethodDescriptor.ofConstructor(AnnotationRegisteredProviders.class),
constructor.getThis());

for (AnnotationInstance instance : index.getAnnotations(ResteasyReactiveDotNames.PROVIDER)) {
// TODO: we may want to filter out stuff that is server side only
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's the part I'm not really sure about.
@geoand do you think registering everything here can have some side effects?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You need to honor this: https://quarkus.io/guides/rest-client#rest-client-and-resteasy-interactions (or at least have an equivalent).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exactly. We already do the equivalent on the server side

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know how I could be unaware of this :) thank you! Fixing

@michalszynkiewicz michalszynkiewicz force-pushed the rest-client-reactive-provider-support branch from 4c717be to b32cf91 Compare July 23, 2021 08:26
@quarkus-bot
Copy link

quarkus-bot bot commented Jul 23, 2021

This workflow status is outdated as a new workflow run has been triggered.

Failing Jobs - Building b32cf91

Status Name Step Test failures Logs Raw logs
JVM Tests - JDK 11 Build Test failures Logs Raw logs
JVM Tests - JDK 11 Windows Build ⚠️ Check → Logs Raw logs
JVM Tests - JDK 16 Build Test failures Logs Raw logs
MicroProfile TCKs Tests Verify Test failures Logs Raw logs
Native Tests - Security2 Build ⚠️ Check → Logs Raw logs

Full information is available in the Build summary check run.

Test Failures

⚙️ JVM Tests - JDK 11 #

📦 integration-tests/oidc-client-reactive

io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactive - More details - Source on GitHub

java.lang.RuntimeException: 
java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
	[error]: Build step io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#registerProvidersFromAnnotations threw an exception: java.lang.NullPointerException
	at io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor.getAnnotatedPriority(RestClientReactiveProcessor.java:269)
	at io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor.registerProvidersFromAnnotations(RestClientReactiveProcessor.java:247)
	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...

⚙️ JVM Tests - JDK 16 #

📦 integration-tests/oidc-client-reactive

io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactive - More details - Source on GitHub

java.lang.RuntimeException: 
java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
	[error]: Build step io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#registerProvidersFromAnnotations threw an exception: java.lang.NullPointerException: Cannot invoke "org.jboss.jandex.ClassInfo.classAnnotation(org.jboss.jandex.DotName)" because "providerClass" is null
	at io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor.getAnnotatedPriority(RestClientReactiveProcessor.java:269)
	at io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor.registerProvidersFromAnnotations(RestClientReactiveProcessor.java:247)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:...

⚙️ MicroProfile TCKs Tests #

📦 tcks/microprofile-rest-client-reactive

org.eclipse.microprofile.rest.client.tck.cditests.HasAppScopeTest.arquillianBeforeClass - More details - Source on GitHub

org.jboss.arquillian.container.spi.client.container.DeploymentException: Unable to start the runtime runner
	at io.quarkus.arquillian.QuarkusDeployableContainer.deploy(QuarkusDeployableContainer.java:233)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:151)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:118)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.executeOperation(ContainerDeployController.java:239)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.deploy(ContainerDeployController.java:118)
	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(DelegatingMethodAccesso...

org.eclipse.microprofile.rest.client.tck.cditests.HasRequestScopeTest.arquillianBeforeClass - More details - Source on GitHub

org.jboss.arquillian.container.spi.client.container.DeploymentException: Unable to start the runtime runner
	at io.quarkus.arquillian.QuarkusDeployableContainer.deploy(QuarkusDeployableContainer.java:233)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:151)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:118)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.executeOperation(ContainerDeployController.java:239)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.deploy(ContainerDeployController.java:118)
	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(DelegatingMethodAccesso...

org.eclipse.microprofile.rest.client.tck.cditests.HasSessionScopeTest.arquillianBeforeClass - More details - Source on GitHub

org.jboss.arquillian.container.spi.client.container.DeploymentException: Unable to start the runtime runner
	at io.quarkus.arquillian.QuarkusDeployableContainer.deploy(QuarkusDeployableContainer.java:233)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:151)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:118)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.executeOperation(ContainerDeployController.java:239)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.deploy(ContainerDeployController.java:118)
	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(DelegatingMethodAccesso...

org.eclipse.microprofile.rest.client.tck.cditests.HasSingletonScopeTest.arquillianBeforeClass - More details - Source on GitHub

org.jboss.arquillian.container.spi.client.container.DeploymentException: Unable to start the runtime runner
	at io.quarkus.arquillian.QuarkusDeployableContainer.deploy(QuarkusDeployableContainer.java:233)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:151)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:118)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.executeOperation(ContainerDeployController.java:239)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.deploy(ContainerDeployController.java:118)
	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(DelegatingMethodAccesso...

@michalszynkiewicz michalszynkiewicz force-pushed the rest-client-reactive-provider-support branch from b32cf91 to dd69a26 Compare July 23, 2021 09:50
@quarkus-bot
Copy link

quarkus-bot bot commented Jul 23, 2021

This workflow status is outdated as a new workflow run has been triggered.

Failing Jobs - Building dd69a26

Status Name Step Test failures Logs Raw logs
JVM Tests - JDK 11 Build Test failures Logs Raw logs
JVM Tests - JDK 16 Build Test failures Logs Raw logs
MicroProfile TCKs Tests Verify Test failures Logs Raw logs
Native Tests - Security2 Build Test failures Logs Raw logs

Full information is available in the Build summary check run.

Test Failures

⚙️ JVM Tests - JDK 11 #

📦 integration-tests/oidc-client-reactive

io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactiveAndRefreshTokens line 73 - More details - Source on GitHub

org.awaitility.core.ConditionTimeoutException: Assertion condition defined in private void io.quarkus.it.keycloak.OidcClientTest.checkLog() Log file must contain a single OidcClientImpl token acquisition confirmation ==> expected: <1> but was: <2> within 10 seconds.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:166)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:119)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:31)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:939)
	at org.awaitility.core.ConditionFactory.untilAsserted(ConditionFactory.java:723)
	at io.quarkus.it.keycloak.OidcClientTest.checkLog(OidcClientTest.java:80)
	at io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactiveAndRefreshTokens(OidcClientTest.java:73)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAc...

⚙️ JVM Tests - JDK 16 #

📦 integration-tests/oidc-client-reactive

io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactiveAndRefreshTokens line 73 - More details - Source on GitHub

org.awaitility.core.ConditionTimeoutException: Assertion condition defined in private void io.quarkus.it.keycloak.OidcClientTest.checkLog() Log file must contain a single OidcClientImpl token acquisition confirmation ==> expected: <1> but was: <2> within 10 seconds.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:166)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:119)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:31)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:939)
	at org.awaitility.core.ConditionFactory.untilAsserted(ConditionFactory.java:723)
	at io.quarkus.it.keycloak.OidcClientTest.checkLog(OidcClientTest.java:80)
	at io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactiveAndRefreshTokens(OidcClientTest.java:73)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAc...

⚙️ MicroProfile TCKs Tests #

📦 tcks/microprofile-rest-client-reactive

org.eclipse.microprofile.rest.client.tck.cditests.CDIClientHeadersFactoryTest.arquillianBeforeClass - More details - Source on GitHub

org.jboss.arquillian.container.spi.client.container.DeploymentException: Unable to start the runtime runner
	at io.quarkus.arquillian.QuarkusDeployableContainer.deploy(QuarkusDeployableContainer.java:233)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:151)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController$3.call(ContainerDeployController.java:118)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.executeOperation(ContainerDeployController.java:239)
	at org.jboss.arquillian.container.impl.client.container.ContainerDeployController.deploy(ContainerDeployController.java:118)
	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(DelegatingMethodAccesso...

⚙️ Native Tests - Security2 #

📦 integration-tests/oidc-client-reactive

io.quarkus.it.keycloak.OidcClientInGraalITCase.testGetUserNameReactiveAndRefreshTokens - More details - Source on GitHub

org.awaitility.core.ConditionTimeoutException: Assertion condition defined in private void io.quarkus.it.keycloak.OidcClientTest.checkLog() Log file must contain a single OidcClientImpl token acquisition confirmation ==> expected: <1> but was: <2> within 10 seconds.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:166)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:119)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:31)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:939)
	at org.awaitility.core.ConditionFactory.untilAsserted(ConditionFactory.java:723)
	at io.quarkus.it.keycloak.OidcClientTest.checkLog(OidcClientTest.java:80)
	at io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactiveAndRefreshTokens(OidcClientTest.java:73)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAc...

@sberyozkin
Copy link
Member

sberyozkin commented Jul 23, 2021

@michalszynkiewicz as we've discussed,
oidc-reactive-client-filter/OidcClientRecativeRequestFilter is meant to be registered selectively - you've confirmed that removing @Provider does not affect that the tests since the users are expected to use @RegisterProvider.

Note, with ResteasyClassic, OidcClientRequestFilter, marked with @Provider is registered either selectively with @RegisterProvider or globally for all the clients - it is important to be able to control it:

if (config.registerFilter) {
      // REGISTER for all the clients
      jaxrsProviders.produce(new ResteasyJaxrsProviderBuildItem(OidcClientRequestFilter.class.getName()));
} else {
      // selected registration is expected
      restAnnotationProvider.produce(new RestClientAnnotationProviderBuildItem(OIDC_CLIENT_FILTER,
                    OidcClientRequestFilter.class));
}


Note there @Provider has no side-effects.

I'm concerned that just picking up all @Provider filters and applying them to all the clients globally may have side-effects.
@Provider It is only meant to be a scanning hint - it was added to the spec before client filters were introduced. Besides MP Rest Client users are used to using @RegisterProvider. There will likely be duplicate registrations.

IMHO it makes sense to address the issue of the duplicates as part of this PR, i.e if you have @Provider added to MyProvider (I added it thinking it could be important for Quarkus to recognize it, like I said OidcClientRequestFilter has no problems in RestEasy Classic, yet) then it does not mean MP RestClient with @RegisterProvider(MyProvider.class) should have 2 instances of MyProvider.

@sberyozkin
Copy link
Member

@michalszynkiewicz

Please also check what the MP RestClient expectations around @Provider (since MP Rest Client != JAX-RS spec) are. if MP RestClient only knows about RegisterProvider then Quarkus also registering all applicable @Provider may indeed cause the duplicates. Registering @provider automatically for the client may be a good improvement - but there should be some guards to protects against the side-effects. For example, @Feature may also be registered in JAX-RS at either the client or server sides.
See the Feature docs, specifically:

 * <p>
 * Features implementing this interface MAY be annotated with the {@link javax.ws.rs.ext.Provider &#64;Provider}
 * annotation in order to be discovered by the runtime when scanning for resources and providers.
 * Please note that this will only work for server side features. Features in the Client API must
 * be registered programmatically.
 * </p>

See the note that at the client side only the programmatic registration is expected

@michalszynkiewicz
Copy link
Member Author

thanks @sberyozkin !

MicroProfile Rest Client specification does not mention @Provider at all. I asked Andy, who leads the spec, how he handles it in his implementation.

Re the duplicates, what I currently have stores the providers to register (either registered @RegisterProvider or @Provider) in a map, so there will only be a single provider per class defined this way.
Programmatically registered providers are a different story.

I can add a switch to disable automatic discovery for @Providers for rest client, e.g. quarkus.rest-client.provider-autodiscovery, defaulting to true... I'll add it to this PR.

@michalszynkiewicz michalszynkiewicz force-pushed the rest-client-reactive-provider-support branch from dd69a26 to 43a7611 Compare July 23, 2021 20:10
@quarkus-bot
Copy link

quarkus-bot bot commented Jul 23, 2021

This workflow status is outdated as a new workflow run has been triggered.

Failing Jobs - Building 43a7611

Status Name Step Test failures Logs Raw logs
JVM Tests - JDK 11 Build Test failures Logs Raw logs
JVM Tests - JDK 16 Build Test failures Logs Raw logs
Native Tests - Security2 Build Test failures Logs Raw logs

Full information is available in the Build summary check run.

Test Failures

⚙️ JVM Tests - JDK 11 #

📦 integration-tests/oidc-client-reactive

io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactiveAndRefreshTokens line 73 - More details - Source on GitHub

org.awaitility.core.ConditionTimeoutException: Assertion condition defined in private void io.quarkus.it.keycloak.OidcClientTest.checkLog() Log file must contain a single OidcClientImpl token acquisition confirmation ==> expected: <1> but was: <2> within 10 seconds.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:166)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:119)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:31)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:939)
	at org.awaitility.core.ConditionFactory.untilAsserted(ConditionFactory.java:723)
	at io.quarkus.it.keycloak.OidcClientTest.checkLog(OidcClientTest.java:80)
	at io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactiveAndRefreshTokens(OidcClientTest.java:73)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAc...

⚙️ JVM Tests - JDK 16 #

📦 integration-tests/oidc-client-reactive

io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactiveAndRefreshTokens line 73 - More details - Source on GitHub

org.awaitility.core.ConditionTimeoutException: Assertion condition defined in private void io.quarkus.it.keycloak.OidcClientTest.checkLog() Log file must contain a single OidcClientImpl token acquisition confirmation ==> expected: <1> but was: <2> within 10 seconds.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:166)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:119)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:31)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:939)
	at org.awaitility.core.ConditionFactory.untilAsserted(ConditionFactory.java:723)
	at io.quarkus.it.keycloak.OidcClientTest.checkLog(OidcClientTest.java:80)
	at io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactiveAndRefreshTokens(OidcClientTest.java:73)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAc...

⚙️ Native Tests - Security2 #

📦 integration-tests/oidc-client-reactive

io.quarkus.it.keycloak.OidcClientInGraalITCase.testGetUserNameReactiveAndRefreshTokens - More details - Source on GitHub

org.awaitility.core.ConditionTimeoutException: Assertion condition defined in private void io.quarkus.it.keycloak.OidcClientTest.checkLog() Log file must contain a single OidcClientImpl token acquisition confirmation ==> expected: <1> but was: <2> within 10 seconds.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:166)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:119)
	at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:31)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:939)
	at org.awaitility.core.ConditionFactory.untilAsserted(ConditionFactory.java:723)
	at io.quarkus.it.keycloak.OidcClientTest.checkLog(OidcClientTest.java:80)
	at io.quarkus.it.keycloak.OidcClientTest.testGetUserNameReactiveAndRefreshTokens(OidcClientTest.java:73)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAc...

@michalszynkiewicz michalszynkiewicz force-pushed the rest-client-reactive-provider-support branch 2 times, most recently from 6e0af54 to 27160d0 Compare July 23, 2021 21:39
@quarkus-bot
Copy link

quarkus-bot bot commented Jul 23, 2021

This workflow status is outdated as a new workflow run has been triggered.

Failing Jobs - Building 27160d0

Status Name Step Test failures Logs Raw logs
Initial JDK 11 Build Build ⚠️ Check → Logs Raw logs

@michalszynkiewicz michalszynkiewicz force-pushed the rest-client-reactive-provider-support branch from 27160d0 to 2b52269 Compare July 24, 2021 12:20
@michalszynkiewicz
Copy link
Member Author

@geoand I added the switch, can you take another look if you still approve?

@michalszynkiewicz michalszynkiewicz merged commit fcde34d into quarkusio:main Jul 26, 2021
@quarkus-bot quarkus-bot bot added this to the 2.2 - main milestone Jul 26, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

@RegisterProvider required for resteasy interfaces
4 participants