jersey icon indicating copy to clipboard operation
jersey copied to clipboard

Ambiguous dependencies injection when using the new CDI2

Open jerseyrobot opened this issue 8 years ago • 11 comments

Hi Jersey team,

using the new CDI2 bridge for jersey, I have this error :

org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type HttpServletRequest with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject org.glassfish.jersey.tests.integration.jersey2704.TestResource.request
  at org.glassfish.jersey.tests.integration.jersey2704.TestResource.request(TestResource.java:0)
  Possible dependencies: 
  - org.glassfish.jersey.inject.cdi.se.bean.SupplierBeanBridge@56820446,
  - org.glassfish.jersey.inject.cdi.se.bean.SupplierBeanBridge@c14bbab

	at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:383)
	at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:287)
	at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:140)
	at org.jboss.weld.bootstrap.Validator.validateCustomBean(Validator.java:195)
	at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:520)
	at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:63)
	at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:61)
	at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:62)
	at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:55)
	at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

Here a test case for it : https://github.com/hypnoce/jersey/commit/7e8a4c7b88c3e57946541335877b545791422905

The execution flow is the following :

jerseyrobot avatar Jul 18 '17 13:07 jerseyrobot

  • Issue Imported From: https://github.com/jersey/jersey/issues/3621
  • Original Issue Raised By:@hypnoce
  • Original Issue Assigned To: Unassigned

jerseyrobot avatar Apr 20 '18 08:04 jerseyrobot

@cthiebaud Commented I have the same problem. Is there any workaround that I can do on the application side before the bug is fixed ? thanks

jerseyrobot avatar Aug 01 '17 17:08 jerseyrobot

@dan-osterrath Commented Same problem here. Any workarounds for that? I need to access the HttpServletRequest or the Session inside of a ContainerRequestFilter.

jerseyrobot avatar Mar 20 '18 09:03 jerseyrobot

@dan-osterrath Commented Even programmatic lookup via CDI.current().select() was not successfully. I could iterate over the 2 found Instances for HttpServletRequest, unfortunately both were implementations of ResponseFacade. WTF?!?

My workaround was a migration to RestEasy. #SAD

jerseyrobot avatar Mar 23 '18 16:03 jerseyrobot

@hypnoce Commented In general, I believe jersey is a dying project. No bug fix, no impovements, poor commiter community. Resteasy (wildfly-swarm flavor) is the way to go for microservices with java standards.

jerseyrobot avatar Mar 28 '18 17:03 jerseyrobot

@Cousjava Commented @hypnoce I think the community is waiting on Oracle for the Jersey to be handed over to the Eclipse Foundation, at that point I expect work on it to resume in earnest. See also #3710.

jerseyrobot avatar Mar 29 '18 08:03 jerseyrobot

This issue is still present in Jersey 2.37. Is there any known workaround?

bramhaag avatar Dec 22 '22 20:12 bramhaag

I have missed this. I think the issue is that Weld started to add a bean for HttpServletRequest. If that's the case, the workaround is to inject an instance

@Inject
Instance<HttpServletRequest> allHttpServletRequests

And you can iterate through all the HttpServletRequests, or take just the one you like.

jansupol avatar Dec 22 '22 20:12 jansupol

@jansupol That unfortunately does not work for me. I have defined the following class that produces a RequestWrapper:

public class TestProducer
{
    @Produces
    @RequestScoped
    public RequestWrapper getWrapper(Instance<HttpServletRequest> requests)
    {
        return new RequestWrapper(requests.iterator().next());
    }

    public static class RequestWrapper
    {
        private final HttpServletRequest request;

        public RequestWrapper(HttpServletRequest request)
        {
            this.request = request;
        }

        public HttpServletRequest getRequest()
        {
            return request;
        }
    }
}

and a class that tries to inject a RequestWrapper instance:

@Named("Test Resource")
@Path("/test")
@RequestScoped
public class TestResource
{
    private final TestProducer.RequestWrapper wrapper;

    @Inject
    public BoardResource(TestProducer.RequestWrapper wrapper)
    {
        this.wrapper = wrapper;
        System.out.println(wrapper.getRequest());
    }

When making a request to this resource, I get:

org.jboss.weld.exceptions.AmbiguousResolutionException: WELD-001335: Ambiguous dependencies for type Ref<HttpServletRequest> with qualifiers @Default
 Possible dependencies: 
  - org.glassfish.jersey.inject.cdi.se.bean.SupplierInstanceBeanBridge@12266084,
  - org.glassfish.jersey.inject.cdi.se.bean.SupplierInstanceBeanBridge@12d44a2a
	at org.jboss.weld.bean.builtin.InstanceImpl.checkBeanResolved(InstanceImpl.java:244)
	at org.jboss.weld.bean.builtin.InstanceImpl.get(InstanceImpl.java:113)
	at org.glassfish.jersey.internal.inject.ReferencingFactory.get(ReferencingFactory.java:69)
	at org.glassfish.jersey.inject.cdi.se.bean.SupplierBeanBridge.create(SupplierBeanBridge.java:110)
	at org.jboss.weld.contexts.AbstractContext.get(AbstractContext.java:96)
	at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:100)
	at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50)
	at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:102)
	at org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance(ProxyMethodHandler.java:131)
	at org.jboss.weld.generated.proxiesx.servlet.http.HttpServletRequest$1919533564$Proxy$_$$_WeldClientProxy.toString(Unknown Source)
	at java.base/java.lang.String.valueOf(String.java:2951)
	at java.base/java.io.PrintStream.println(PrintStream.java:897)
	at com.test.TestResource.<init>(TestResource.java:42)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:119)
	at org.jboss.weld.injection.ConstructorInjectionPoint.invokeAroundConstructCallbacks(ConstructorInjectionPoint.java:92)
	at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:78)
	at org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:28)
	at org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:112)
	at org.glassfish.jersey.inject.cdi.se.bean.ClassBean.create(ClassBean.java:96)
	at org.jboss.weld.contexts.AbstractContext.get(AbstractContext.java:96)
	at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:100)
	at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50)
	at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:102)
	at org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance(ProxyMethodHandler.java:131)
	at com.test.TestResource$Proxy$_$$_WeldClientProxy.get(Unknown Source)
	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 org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:134)
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:177)
	at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:219)
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:81)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:478)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:400)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
	at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:255)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
	at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
	at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:234)
	at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684)
	at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394)
	at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:358)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:311)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
	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 org.apache.catalina.security.SecurityUtil.lambda$execute$0(SecurityUtil.java:280)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/javax.security.auth.Subject.doAsPrivileged(Subject.java:550)
	at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:311)
	at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:170)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:221)
	at org.apache.catalina.core.ApplicationFilterChain.lambda$doFilter$0(ApplicationFilterChain.java:145)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:143)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1787)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Thread.java:829)

bramhaag avatar Dec 22 '22 20:12 bramhaag

Hello,

@Path("/rental")
public class RentalController {

  @Context
  private HttpServletRequest request;

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Response rentBike() {
    var user = request.getAttribute("authenticatedUser");
  }
}

This example looks like it gives the same issue and haven't found a workaround yet...

Nomehh avatar Nov 14 '24 19:11 Nomehh

@Nomehh Please file a new bug for the issue and link this. Otherwise, it can get overlooked again. Thanks!

jansupol avatar Nov 15 '24 18:11 jansupol