Search code examples
glassfishjax-rsjava-ee-7

GlassFish 4.1.1: Unable to @Inject simple @Stateless in Java EE 7 JAX-RS App


I am using Glassfish 4.1.1 as my Java server. I am trying to @Inject a simple @Stateless bean in my JAX-RS class having @Path annotation. Here is the exception I am getting:

javax.servlet.ServletException: A MultiException has 1 exceptions.  They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=MongoCollectionStore,parent=DemoJaxrsApp,qualifiers={},position=-1,optional=false,self=false,unqualified=null,310751270)

Here is my JAX-RS config:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/rest")
public class JaxrsAppConfig extends Application {
    
}

This is how my JAX-RS resource class looks like:

@Path("/tn-collection")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class DemoJaxrsApp {
    
    @Inject
    MongoCollectionStore mongoCollectionStore;
    
    @POST
    public List<CollectionTO> getColl() {
        return mongoCollectionStore.findAll();
    }
}

I am using only 2 dependencies:

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.3.0</version>
    </dependency>
    
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.3.1</version>
    </dependency>

It shouldn't be a problem with dependencies. I am not using any XML files (other than POM.xml and nb-configuration.xml, generated by Netbeans 8.1) as Java EE 7 need not have any config files. I don't know what might have gone wrong.

How can I resolve this UnsatisfiedDependencyException problem?

Update

Here is my MongoCollectionStore Java class:

@Stateless
public class MongoCollectionStore {
    
    public List<CollectionTO> findAll(MongoConfig mongoConfig) {
        List<CollectionTO> tuples = new ArrayList<>();
        Gson gson = new Gson();
        
        MongoClient mongoClient = new MongoClient("127.0.0.1", 27017);
        MongoDatabase mongoDB = mongoClient.getDatabase("Demo");
        MongoCollection<Document> coll = mongoDB.getCollection("DemoCollection");
        
        try(MongoCursor<Document> cursor = coll.find().iterator()) {
            while (cursor.hasNext()) {
                String jsonDoc = cursor.next().toJson();
                CollectionTO tuple = gson.fromJson(jsonDoc, CollectionTO.class);

                tuples.add(tuple);
            }
        }
        
        return tuples;
    }
}

Solution

  • I was looking through this problem on internet and found that a CDI bean can only be injected into another CDI bean. They both need to be managed by the container. So, I made my DemoJaxrsApp @RequestScoped, in order to make it a CDI bean.

    For guys coming here from Google, Original (and more elaborate) answer can be found here: Inject an EJB into JAX-RS (RESTful service)

    One thing I still don't know is that when I @Injected a @Stateless resource inside my @RequestScoped class, was that resource an EJB? Or, was it a CDI bean? I guess, that's a different question altogether.