GlassFish 4.1.1:无法在 Java EE 7 JAX-RS 应用程序中 @Inject 简单的 @Stateless
GlassFish 4.1.1: Unable to @Inject simple @Stateless in Java EE 7 JAX-RS App
我正在使用 Glassfish 4.1.1
作为我的 Java 服务器。我正在尝试在具有 @Path 注释的 JAX-RS class 中 @Inject 一个简单的 @Stateless bean。这是我得到的异常:
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 资源 class 的样子:
@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 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;
}
}
我在网上查看这个问题,发现一个 CDI bean 只能注入另一个 CDI bean。它们都需要由容器管理。所以,我制作了 DemoJaxrsApp
@RequestScoped
,以使其成为 CDI bean。
对于来自 Google 的朋友们,可以在此处找到原始(和更详尽的)答案:
Inject an EJB into JAX-RS (RESTful service)
我仍然不知道的一件事是,当我在我的 @RequestScoped
class 中 @Inject
ed 一个 @Stateless
资源时,那个资源是 EJB 吗?或者,它是 CDI bean 吗?我想,这完全是一个不同的问题。
我正在使用 Glassfish 4.1.1
作为我的 Java 服务器。我正在尝试在具有 @Path 注释的 JAX-RS class 中 @Inject 一个简单的 @Stateless bean。这是我得到的异常:
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 资源 class 的样子:
@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 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;
}
}
我在网上查看这个问题,发现一个 CDI bean 只能注入另一个 CDI bean。它们都需要由容器管理。所以,我制作了 DemoJaxrsApp
@RequestScoped
,以使其成为 CDI bean。
对于来自 Google 的朋友们,可以在此处找到原始(和更详尽的)答案: Inject an EJB into JAX-RS (RESTful service)
我仍然不知道的一件事是,当我在我的 @RequestScoped
class 中 @Inject
ed 一个 @Stateless
资源时,那个资源是 EJB 吗?或者,它是 CDI bean 吗?我想,这完全是一个不同的问题。