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

NullPointerException using @Provider in MP Rest Client #2773

Closed
masini opened this issue Jun 10, 2019 · 24 comments · Fixed by #4234
Closed

NullPointerException using @Provider in MP Rest Client #2773

masini opened this issue Jun 10, 2019 · 24 comments · Fixed by #4234
Labels
area/rest-client kind/bug Something isn't working
Milestone

Comments

@masini
Copy link
Contributor

masini commented Jun 10, 2019

Describe the bug
@Inject doesn't work in @Provider when the Provider is used by MP Rest Client

Expected behavior
The Bean injected

Actual behavior
The Bean field is null

To Reproduce
Steps to reproduce the behavior:

  1. git clone https://github.com/masini/quarkus-rest-client-npe
  2. mvn package
  3. Server Test Works, Client Test Fails
@masini masini added the kind/bug Something isn't working label Jun 10, 2019
@masini
Copy link
Contributor Author

masini commented Jun 28, 2019

Any news on this ? Ken have you understood the problem ?

@kenfinnigan
Copy link
Member

Without smallrye-rest-client in the project @Inject works?

I'm not sure if @Inject is intended to work inside a JAX-RS @Provider. Not sure if @mkouba or @asoldano know

@masini
Copy link
Contributor Author

masini commented Jun 28, 2019 via email

@kenfinnigan
Copy link
Member

kenfinnigan commented Jun 28, 2019 via email

@masini
Copy link
Contributor Author

masini commented Jun 29, 2019 via email

@mkouba
Copy link
Contributor

mkouba commented Jul 1, 2019

So I'm not really sure as I am no JAX-RS expert.

However, it seems that even JAX-RS built-in injection using the @Context annotation does not cover all use cases on the client-side - see 10.2 Context Types: "This section describes the types of context available to providers (client and server) as well as resource classes and Application subclasses (server only). Except for Configuration and Providers , which are injectable in both client and server-side providers, all the other types are server-side only."

On the other hand, it could be a nice feature. @gsmet @geoand @michalszynkiewicz WDYT?

@geoand
Copy link
Contributor

geoand commented Jul 1, 2019

@mkouba I am in the same exact situation you are, not a JAX-RS expert but the feature sounds reasonable

@ronsigal
Copy link
Contributor

ronsigal commented Jul 3, 2019

Hey guys,

I, on the other hand, don't know anything about quarkus, and, honestly, I don't have a lot of experience with MicroProfile Client.

One thing that comes to mind is this: Shouldn't CountriesService have a

@RegisterProvider(JsonbContextResolver.class)

annotation? I tried it, though, and it doesn't help.

I'll keep looking.

-Ron

@ronsigal
Copy link
Contributor

@asoldano has reminded me of the existence of this issue. As the Innkeeper of Bree said, "One thing drives out another".

  1. Currently, the expected injection does not work in RESTEasy. The fact is that there is no discussion in the JAX-RS spec of how to treat a Client created on a server. Given the importance of the issue, I think it's something that should be addressed, eventually.

  2. In the meantime, making the injection work is a feature we could add to RESTEasy. We've been discussing how to do it. For example, we could support CDI injection for clients, wherever they live.

-Ron

@masini
Copy link
Contributor Author

masini commented Jul 30, 2019 via email

@ronsigal
Copy link
Contributor

@masini, I'll take that as a vote for making injection work, one way or another.

@ronsigal
Copy link
Contributor

I've been looking into this issue again, and I have some information to add.

I've turned the example at https://github.com/masini/quarkus-rest-client-npe into a WAR, deployed it to Wildfly, and it works as expected, i.e., there is no NPE. This suggests to me that there might be some issue with CDI in Quarkus. I'm sadly ignorant about Quarkus, but I got the following comment from Bill Burke: "I'd make sure that the ContextResolver is being allocated by Arc (quarkus cdi implementation)."

Can someone from the Quarkus group comment?

@geoand
Copy link
Contributor

geoand commented Sep 24, 2019

I can take a quick look tomorrow

@geoand
Copy link
Contributor

geoand commented Sep 24, 2019

I looked at this again briefly without reading the discussion and it struck as odd that @Inject didn't work. @mkouba I think we should add support for it

@ronsigal
Copy link
Contributor

@geoand, just to be sure, by "we" you mean Quarkus?

@geoand
Copy link
Contributor

geoand commented Sep 24, 2019

@ronsigal yup :)

@ronsigal
Copy link
Contributor

Cool. ;-)

@mkouba
Copy link
Contributor

mkouba commented Sep 25, 2019

Well, I don't think this is a CDI/ArC issue. The beans for JsonbObjectMapper and JsonbContextResolver are there and look ok. The question is how and where is the JsonbContextResolver provider instance created?

I've debugged the reproducer and the provider instance is created here: https://github.com/resteasy/Resteasy/blob/master/providers/json-binding/src/main/java/org/jboss/resteasy/plugins/providers/jsonb/AbstractJsonBindingProvider.java#L27 which delegates to ClientConfiguration.getContextResolver() and LocalResteasyProviderFactory respectively. An important thing is that QuarkusInjectorFactory is not used here.

And so I believe that if we use the QuarkusInjectorFactory even for the RESTEasy client the injection should work. @ronsigal @geoand @gsmet WDYT?

@geoand
Copy link
Contributor

geoand commented Sep 25, 2019

I like the idea and it sound perfectly reasonable although I admit I don't know much about the client

@ronsigal
Copy link
Contributor

@mkouba, I think we're seeing different things. I've added a no-arg constructor to JsonbContextResolver:

public JsonbContextResolver() {
   System.out.println(this);
   new Exception(this.toString()).printStackTrace();
}

and I see the JsonbContextResolver created in three steps. In particular, there is a QuarkusInjectorFactory in step 3 below:

  1. A JsonbContextResolver POJO is created:

org.acme.restclient.JsonbContextResolver@142269f2
java.lang.Exception: org.acme.restclient.JsonbContextResolver@142269f2
at org.acme.restclient.JsonbContextResolver.(JsonbContextResolver.java:18)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.jboss.resteasy.core.ConstructorInjectorImpl.lambda$construct$8(ConstructorInjectorImpl.java:179)
at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:602)
at java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:614)
at java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:1983)
at java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:110)
at org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:176)
at org.jboss.resteasy.core.providerfactory.Utils.createProviderInstance(Utils.java:90)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.createProviderInstance(ResteasyProviderFactoryImpl.java:1413)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.processProviderContracts(ResteasyProviderFactoryImpl.java:924)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:880)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:867)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:792)
at io.quarkus.smallrye.restclient.runtime.SmallRyeRestClientTemplate.registerProviders(SmallRyeRestClientTemplate.java:71)
at io.quarkus.smallrye.restclient.runtime.SmallRyeRestClientTemplate.initializeResteasyProviderFactory(SmallRyeRestClientTemplate.java:61)
at io.quarkus.deployment.steps.SmallRyeRestClientProcessor$registerProviders10.deploy_0(Unknown Source)
at io.quarkus.deployment.steps.SmallRyeRestClientProcessor$registerProviders10.deploy(Unknown Source)
at io.quarkus.runner.ApplicationImpl1.(Unknown Source)

  1. A JsonbContextResolver_ClientProxy is created:

org.acme.restclient.JsonbContextResolver_ClientProxy@d8305c2
java.lang.Exception: org.acme.restclient.JsonbContextResolver_ClientProxy@d8305c2
at org.acme.restclient.JsonbContextResolver.(JsonbContextResolver.java:18)
at org.acme.restclient.JsonbContextResolver_ClientProxy.(Unknown Source)
at org.acme.restclient.JsonbContextResolver_Bean$$function$$2.get(Unknown Source)
at io.quarkus.arc.LazyValue.get(LazyValue.java:42)
at org.acme.restclient.JsonbContextResolver_Bean.get(Unknown Source)
at org.acme.restclient.JsonbContextResolver_Bean.get(Unknown Source)
at io.quarkus.arc.ArcContainerImpl.beanInstanceHandle(ArcContainerImpl.java:324)
at io.quarkus.arc.ArcContainerImpl.beanInstanceHandle(ArcContainerImpl.java:336)
at io.quarkus.arc.ArcContainerImpl$1.get(ArcContainerImpl.java:210)
at io.quarkus.arc.ArcContainerImpl$1.get(ArcContainerImpl.java:207)
at io.quarkus.arc.runtime.ArcDeploymentTemplate$2$1.create(ArcDeploymentTemplate.java:86)
at io.quarkus.resteasy.server.common.runtime.QuarkusConstructorInjector.construct(QuarkusConstructorInjector.java:57)
at org.jboss.resteasy.core.providerfactory.Utils.createProviderInstance(Utils.java:90)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.createProviderInstance(ResteasyProviderFactoryImpl.java:1413)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.processProviderContracts(ResteasyProviderFactoryImpl.java:924)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:880)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:867)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:792)
at org.jboss.resteasy.core.ResteasyDeploymentImpl.registerProvider(ResteasyDeploymentImpl.java:636)
at org.jboss.resteasy.core.ResteasyDeploymentImpl.registration(ResteasyDeploymentImpl.java:417)
at org.jboss.resteasy.core.ResteasyDeploymentImpl.startInternal(ResteasyDeploymentImpl.java:287)
at org.jboss.resteasy.core.ResteasyDeploymentImpl.start(ResteasyDeploymentImpl.java:89)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:131)
at org.jboss.resteasy.plugins.server.servlet.FilterDispatcher.init(FilterDispatcher.java:47)
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:111)
at io.undertow.servlet.core.ManagedFilter.createFilter(ManagedFilter.java:80)
at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:589)
at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:554)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.quarkus.undertow.runtime.UndertowDeploymentTemplate$7$1$1.call(UndertowDeploymentTemplate.java:460)
at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:596)
at io.quarkus.undertow.runtime.UndertowDeploymentTemplate.bootServletContainer(UndertowDeploymentTemplate.java:433)
at io.quarkus.deployment.steps.UndertowBuildStep$build15.deploy_0(Unknown Source)
at io.quarkus.deployment.steps.UndertowBuildStep$build15.deploy(Unknown Source)
at io.quarkus.runner.ApplicationImpl1.(Unknown Source)

  1. Injection is performed by QuarkusInjectorFactory:

    org.acme.restclient.JsonbContextResolver@1fcb4808
    java.lang.Exception: org.acme.restclient.JsonbContextResolver@1fcb4808
    at org.acme.restclient.JsonbContextResolver.(JsonbContextResolver.java:18)
    at org.acme.restclient.JsonbContextResolver_Bean.create(Unknown Source)
    at org.acme.restclient.JsonbContextResolver_Bean.create(Unknown Source)
    at io.quarkus.arc.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:86)
    at io.quarkus.arc.AbstractSharedContext.lambda$new$0(AbstractSharedContext.java:33)
    at io.quarkus.arc.ComputingCache$CacheFunction.lambda$apply$0(ComputingCache.java:115)
    at io.quarkus.arc.LazyValue.get(LazyValue.java:42)
    at io.quarkus.arc.ComputingCache.getValue(ComputingCache.java:57)
    at io.quarkus.arc.AbstractSharedContext.get(AbstractSharedContext.java:39)
    at org.acme.restclient.JsonbContextResolver_ClientProxy.delegate(Unknown Source)
    at org.acme.restclient.JsonbContextResolver_ClientProxy.getContextualInstance(Unknown Source)
    at io.quarkus.arc.runtime.ClientProxyUnwrapper.apply(ClientProxyUnwrapper.java:27)
    at io.quarkus.resteasy.server.common.runtime.ResteasyServerCommonTemplate$1.apply(ResteasyServerCommonTemplate.java:35)
    at io.quarkus.resteasy.server.common.runtime.QuarkusInjectorFactory$UnwrappingPropertyInjector.inject(QuarkusInjectorFactory.java:81)
    at org.jboss.resteasy.core.providerfactory.Utils.injectProperties(Utils.java:70)
    at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.addContextResolver(ResteasyProviderFactoryImpl.java:694)
    at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.processProviderContracts(ResteasyProviderFactoryImpl.java:924)
    at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:880)
    at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:867)
    at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:792)
    at org.jboss.resteasy.core.ResteasyDeploymentImpl.registerProvider(ResteasyDeploymentImpl.java:636)
    at org.jboss.resteasy.core.ResteasyDeploymentImpl.registration(ResteasyDeploymentImpl.java:417)
    at org.jboss.resteasy.core.ResteasyDeploymentImpl.startInternal(ResteasyDeploymentImpl.java:287)
    at org.jboss.resteasy.core.ResteasyDeploymentImpl.start(ResteasyDeploymentImpl.java:89)
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:131)
    at org.jboss.resteasy.plugins.server.servlet.FilterDispatcher.init(FilterDispatcher.java:47)
    at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:111)
    at io.undertow.servlet.core.ManagedFilter.createFilter(ManagedFilter.java:80)
    at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:589)
    at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:554)
    at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
    at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    at io.quarkus.undertow.runtime.UndertowDeploymentTemplate$7$1$1.call(UndertowDeploymentTemplate.java:460)
    at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:596)
    at io.quarkus.undertow.runtime.UndertowDeploymentTemplate.bootServletContainer(UndertowDeploymentTemplate.java:433)
    at io.quarkus.deployment.steps.UndertowBuildStep$build15.deploy_0(Unknown Source)
    at io.quarkus.deployment.steps.UndertowBuildStep$build15.deploy(Unknown Source)
    at io.quarkus.runner.ApplicationImpl1.(Unknown Source)

@mkouba
Copy link
Contributor

mkouba commented Sep 26, 2019

@ronsigal Ok, I need to double check. Anyway, pls upgrade the reproducer, ie. quarkus from 0.16.1 to 0.22.0 and io.quarkus:quarkus-smallrye-rest-client => io.quarkus:quarkus-rest-client. The MP Rest Client impl was switched from SmallRye to RESTEasy. Also some integration classes changed.

@mkouba
Copy link
Contributor

mkouba commented Sep 26, 2019

@ronsigal Ok, so I've tried to add a no-arg constructor to the JsonbContextResolver and I can also see 3 instances created:

1. Instance created for RestClient - InjectorFactoryImpl used

	at org.acme.restclient.JsonbContextResolver.<init>(JsonbContextResolver.java:18)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.jboss.resteasy.core.ConstructorInjectorImpl.lambda$construct$8(ConstructorInjectorImpl.java:179)
	at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:602)
	at java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:614)
	at java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:1983)
	at java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:110)
	at org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:176)
	at org.jboss.resteasy.core.providerfactory.Utils.createProviderInstance(Utils.java:90)
	at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.createProviderInstance(ResteasyProviderFactoryImpl.java:1422)
	at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.processProviderContracts(ResteasyProviderFactoryImpl.java:933)
	at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:889)
	at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:876)
	at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:801)
	at io.quarkus.restclient.runtime.RestClientRecorder.registerProviders(RestClientRecorder.java:56)

2. Client proxy created during ArC init, JsonbContextResolver_ClientProxy extends JsonbContextResolver

at org.acme.restclient.JsonbContextResolver.<init>(JsonbContextResolver.java:18)
	at org.acme.restclient.JsonbContextResolver_ClientProxy.<init>(JsonbContextResolver_ClientProxy.zig:21)
	at org.acme.restclient.JsonbContextResolver_Bean.<init>(JsonbContextResolver_Bean.zig:94)
	at io.quarkus.arc.setup.Default_ComponentsProvider.getComponents(Default_ComponentsProvider.zig:61)

3. Instance created through QuarkusInjectorFactory and used for server-side

	at org.acme.restclient.JsonbContextResolver.<init>(JsonbContextResolver.java:18)
	at org.acme.restclient.JsonbContextResolver_Bean.create(JsonbContextResolver_Bean.zig:197)
	at org.acme.restclient.JsonbContextResolver_Bean.create(JsonbContextResolver_Bean.zig:168)
	at io.quarkus.arc.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:77)
	at io.quarkus.arc.AbstractSharedContext.lambda$new$0(AbstractSharedContext.java:17)
	at io.quarkus.arc.ComputingCache$CacheFunction.lambda$apply$0(ComputingCache.java:99)
	at io.quarkus.arc.LazyValue.get(LazyValue.java:26)
	at io.quarkus.arc.ComputingCache.getValue(ComputingCache.java:41)
	at io.quarkus.arc.AbstractSharedContext.get(AbstractSharedContext.java:23)
	at org.acme.restclient.JsonbContextResolver_ClientProxy.arc$delegate(JsonbContextResolver_ClientProxy.zig:113)
	at org.acme.restclient.JsonbContextResolver_ClientProxy.arc_contextualInstance(JsonbContextResolver_ClientProxy.zig:39)
	at io.quarkus.arc.runtime.ClientProxyUnwrapper.apply(ClientProxyUnwrapper.java:11)
	at io.quarkus.resteasy.server.common.runtime.ResteasyServerCommonRecorder$1.apply(ResteasyServerCommonRecorder.java:19)
	at io.quarkus.resteasy.server.common.runtime.QuarkusInjectorFactory$UnwrappingPropertyInjector.inject(QuarkusInjectorFactory.java:65)
	at org.jboss.resteasy.core.providerfactory.Utils.injectProperties(Utils.java:70)
	at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.addContextResolver(ResteasyProviderFactoryImpl.java:703)
	at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.processProviderContracts(ResteasyProviderFactoryImpl.java:933)
	at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:889)
	at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:876)
	at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.registerProvider(ResteasyProviderFactoryImpl.java:801)
	at org.jboss.resteasy.core.ResteasyDeploymentImpl.registerProvider(ResteasyDeploymentImpl.java:680)

And so I believe that my comment is still relevant.

@geoand
Copy link
Contributor

geoand commented Sep 26, 2019

@mkouba I came across this one as part of my exploration in #4212

@geoand
Copy link
Contributor

geoand commented Sep 26, 2019

OK, so I got this working with a quick and dirty fix. Basically all we need to do is use the QuarkusInjectorFactory in RestClientRecorder when we are setting things up for the client.

I say that the fix is quick and dirty because I just copied stuff from resteasy-server-common to rest-client extensions.
I'll look at it again tomorrow so I can come up with a clean solution

geoand added a commit to geoand/quarkus that referenced this issue Sep 27, 2019
This is done in order to have providers as beans - same as is the case for
resteasy server.

Fixes quarkusio#2773
geoand added a commit to geoand/quarkus that referenced this issue Sep 27, 2019
This is done in order to have providers as beans - same as is the case for
resteasy server.

Fixes quarkusio#2773
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/rest-client kind/bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants