2016-09-09 8 views
0

Я использую Glassfish 4.1.1 как мой сервер Java. Я пытаюсь @Inject простой @Stateless bean-компонента в моем классе JAX-RS с аннотацией @Path. Вот исключение я получаю:GlassFish 4.1.1: Невозможно @Inject простой @Stateless в Java EE 7 Приложение JAX-RS

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

I я использую только 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?

UPDATE:

Вот мой 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; 
    } 
} 
+0

Что такое класс MongoCollectionStore? Он не существует [в документах API] (http://api.mongodb.com/java/3.3/). Вы следили за учебником для этого? Если это так, возможно, в учебнике реализован дополнительный класс, который вы пропустили? – Mike

+0

Его фасоль '@ Stateless', которую я создал. Позвольте мне включить это тоже. Кстати, я могу видеть знак 'I' (который, как я полагаю, обозначает точку инъекции) перед моим полем' @ Injected'ed в Netbeans, что означает, что его реализация предоставляется. –

+0

Вы добавили 'beans.xml' в свой проект? –

ответ

0

Я просматривал эту проблему в Интернете и обнаружил, что КДИ компонент может быть введен только в другой боб CDI. Оба они должны управляться контейнером. Итак, я сделал свой DemoJaxrsApp@RequestScoped, чтобы сделать его CDI bean.

Для ребят, приезжающих сюда из Google, первоначально (и более сложный) ответ может быть найден здесь: Inject an EJB into JAX-RS (RESTful service)

Одна вещь, которую я до сих пор не знаю, что когда я @Inject Эду @Stateless ресурс внутри моего @RequestScoped класса , был ли этот ресурс EJB? Или это был CDI-компонент? Наверное, это совсем другой вопрос.