2015-05-25 6 views
0

Когда я пытаюсь использовать @Inject для ввода моего класса DAO, в менеджере, чтобы он мог предоставить gson-файл текущему адресу, я получаю это исключение, когда я перехожу к определенной сети адрес. Может кто-нибудь объяснить мне, в чем проблема. Я думал, что проблема возникла, возможно, из @Inject, и она работает неправильно, но я не уверен.Невозможно правильно использовать (@Inject)

java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: Cannot obtain a free instance.; nested exception is: 
javax.enterprise.inject.UnsatisfiedResolutionException: Api type [cinema.dao.ProjectionDAO] is not found with the qualifiers 
Qualifiers: [@javax.enterprise.inject.Default()] 
for injection into Field Injection Point, field name : projectionDAO, Bean Owner : [ProjectionManager, Name:null, WebBeans Type:DEPENDENT, API Types:[cinema.services.ProjectionManager,java.lang.Object], Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]] while invoking public java.util.Collection cinema.services.ProjectionManager.getAllProjections() with params []. 
org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:116) 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:324) 
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:240) 
org.apache.openejb.server.cxf.rs.CxfRsHttpListener.onMessage(CxfRsHttpListener.java:187) 
org.apache.openejb.server.rest.RsServlet.service(RsServlet.java:53) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

Код для менеджера:

package cinema.services; 

import java.util.Collection; 

import javax.ejb.Stateless; 
import javax.inject.Inject; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 

import cinema.dao.ProjectionDAO; 
import cinema.model.Projection; 

@Stateless 
@Path("projection") 
public class ProjectionManager { 

    @Inject 
    private ProjectionDAO projectionDAO; 

    @GET 
    @Produces("application/json") 
    public Collection<Projection> getAllProjections(){ 
     return projectionDAO.getAllProjections(); 
    } 

} 

Вот ProjectionDAO:

package cinema.dao; 

import java.util.Collection; 

import javax.inject.Singleton; 
import javax.persistence.EntityManager; 
import javax.persistence.NoResultException; 
import javax.persistence.PersistenceContext; 

import cinema.model.Projection; 
import cinema.model.User; 

@Singleton 
public class ProjectionDAO { 

    @PersistenceContext 
    private EntityManager em; 


    public Collection<Projection> getAllProjections(){ 
     return em.createNamedQuery("getAllProjections",  Projection.class).getResultList(); 
    } 

    public void addProjection(Projection projection){ 

      em.persist(projection); 

    } 

    public Projection findProjectionByMovieTitle(String movieTitle){ 
     try { 
      return em.createNamedQuery("getProjectionByMovieTitle", Projection.class) 
       .setParameter("movieTitle", movieTitle).getSingleResult(); 
     } catch (NoResultException e){ 
      return null; 
     } 
    } 

    public void buyTicket(Projection projection, User user){ 
     Projection foundProjection =  findProjectionByMovieTitle(projection.getMovieTitle()); 
     if(foundProjection != null){ 
      user.getCurrentProjections().add(projection); 
      int newFreeSpaces = foundProjection.getFreeSpaces() - 1; 
      foundProjection.setFreeSpaces(newFreeSpaces); 
     } 
    } 

} 

Проекция простая модель, которая дает MovieTitle и время начала различных проекциях в кино.

+0

Если это в той же войне. Аннотируйте проекцию как с помощью приложений, так и с одноточечным или используйте «@ejb» вместо «@inject» в точке впрыска – maress

ответ

2

В вашем вопросе не указана важная информация, например, используемые версии или способы развертывания, поэтому я собираюсь сделать дикий удар.

  1. Вы не указали в своем развертывании файл beans.xml. Я не уверен, что если вы развертываете WAR или JAR-файл.
  2. Предполагая, что у вас есть правильно размещенный файл beans.xml, попробуйте поменять @Singleton на @ApplicationScope. Это должно более правильно открыть ваш класс.
Смежные вопросы