GlassFish 4.1.1:无法在Java EE 7 JAX-RS应用中@Inject简单的@Stateless



我使用Glassfish 4.1.1作为我的Java服务器。我试图@注入一个简单的@无状态bean在我的JAX-RS类具有@Path注释。下面是我得到的例外:

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)

这是我的JAX-RS配置:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/rest")
public class JaxrsAppConfig extends Application {
    
}

我的JAX-RS资源类是这样的:

@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();
    }
}

我只使用2个依赖项:

    <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>

这应该不是依赖关系的问题。我不使用任何XML文件(除了POM.xml和nb-configuration.xml,由Netbeans 8.1生成),因为Java EE 7不需要任何配置文件。我不知道哪里出了问题。

如何解决这个UnsatisfiedDependencyException问题?

更新这是我的MongoCollectionStore Java类:
@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;
    }
}

我在网上看这个问题,发现一个CDI bean只能被注入到另一个CDI bean中。它们都需要由容器管理。所以,我把我的DemoJaxrsApp变成@RequestScoped,为了使它成为一个CDI bean。

对于从谷歌来这里的家伙,原始的(更详细的)答案可以在这里找到:将EJB注入JAX-RS (RESTful服务)

我仍然不知道的一件事是,当我@Inject在我的@RequestScoped类内设置@Stateless资源时,该资源是EJB吗?或者,它是CDI bean?我想,这是一个完全不同的问题

最新更新