简体   繁体   中英

Using Qualifiers with Jersey 2.0 and CDI

I am reading through Beginning J2EE 7 - Antonio Gonclaves and going through the source code, I have encountered an exception "org.glassfish.hk2.api.UnsatisfiedDependencyException" which I'm finding hard to solve. Without any qualifiers the application works fine. I'm using Netbeans 7.3.1 and Glassfish 4.0. Below is my source code and exception log

These are my service classes which I'm using @Qualifiers to differentiate

@Stateless
@ISBNAlt
public class ISBNGenerator implements INumberGenerator{

    @Override
    public String generateNumberr() {
       return "ISBN generated";
    }

}

Second service class

@Stateless
@ISBNDef
public class ISSNGenerator implements INumberGenerator{

    @Override
    public String generateNumberr() {
        return "Working version 2";
    }


}

The resource class

@ManagedBean
@RequestScoped
@Path("/test")
public class TestClass {

    @Inject @ISBNAlt
    private INumberGenerator ng;


    @Produces(MediaType.TEXT_PLAIN)
    @GET
    public String getValue()
    {
        return ng.generateNumberr();
    }
}

and i use this class for adding resource classes

import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

/**
 *
 * @author naphlin
 */
@ApplicationPath("webresource")
public class ApplicationConfig extends Application{

   @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet<Class<?>>();
        // following code can be used to customize Jersey 2.0 JSON provider:
        try {
            Class jsonProvider = Class.forName("org.glassfish.jersey.jackson.JacksonFeature");
            // Class jsonProvider = Class.forName("org.glassfish.jersey.moxy.json.MoxyJsonFeature");
            // Class jsonProvider = Class.forName("org.glassfish.jersey.jettison.JettisonFeature");
            resources.add(jsonProvider);
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        addRestResourceClasses(resources);
        return resources;
    }  

    /**
     * Do not modify addRestResourceClasses() method.
     * It is automatically re-generated by NetBeans REST support to populate
     * given list with all resources defined in the project.
     */
    private void addRestResourceClasses(Set<Class<?>> resources) {
        resources.add(helpers.TestClass.class);
    }

}

After deploying my application and invoking the REST endpoint, i get this exception

Info:   Initiating Jersey application, version Jersey: 2.0 2013-05-03 14:50:15...
Warning:   StandardWrapperValve[config.ApplicationConfig]: Servlet.service() for servlet config.ApplicationConfig threw exception
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=INumberGenerator,parent=TestClass,qualifiers={@annotations.ISBNAlt()}),position=-1,optional=false,self=false,unqualified=null,1495563497)
    at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)
    at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:191)
    at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:214)
    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:311)
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:448)
    at org.glassfish.jersey.process.internal.RequestScope.findOrCreate(RequestScope.java:157)
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2204)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:579)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:566)
    at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:172)
    at org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:185)
    at org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:105)
    at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:118)
    at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
    at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
    at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
    at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:102)
    at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:62)
    at org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:215)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:198)
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:946)
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:323)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    at java.lang.Thread.run(Thread.java:745)

Any

Works on my machine ;o) No, actually I reproduced your code quickly with JBoss Forge. You can run the following JBoss Forge script if you want :

$ project-new --named testrest
$ rest-setup
$ cdi-setup
$ cdi-new-qualifier --named ISBNAlt --targetPackage org.testrest.util
$ cdi-new-qualifier --named ISBNDef --targetPackage org.testrest.util
$ java-new-interface --named INumberGenerator2 --targetPackage org.testrest.service
$ ejb-new-bean --named ISBNGenerator
$ ejb-new-bean --named ISSNGenerator
$ faces-setup

I deployed it on WildFly, and it's working fine. BTW, as simplification, you don't need @ManagedBean and @RequestScoped on your REST endpoint. Try to get rid of it and re-deploy on GlassFish. You can also give it a try on WildFly first.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM