Java 无法正确使用(@Inject)

Java 无法正确使用(@Inject),java,jakarta-ee,cdi,Java,Jakarta Ee,Cdi,当我尝试使用@Inject注入我的DAO类时,在一个管理器中,为了使它能够将gson文件提供给当前地址,当我转到特定的web地址时,会出现此异常。有人能解释一下问题是什么吗。我认为问题可能来自@Inject,它不能正常工作,但我不确定 java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: Cannot obtain a free instance.; nested exception is: javax.enterprise

当我尝试使用@Inject注入我的DAO类时,在一个管理器中,为了使它能够将gson文件提供给当前地址,当我转到特定的web地址时,会出现此异常。有人能解释一下问题是什么吗。我认为问题可能来自@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();
    }

}
套餐影院服务;
导入java.util.Collection;
导入javax.ejb.Stateless;
导入javax.inject.inject;
导入javax.ws.rs.GET;
导入javax.ws.rs.Path;
导入javax.ws.rs.products;
进口电影院.dao.ProjectionDAO;
导入电影院、模型、投影;
@无国籍
@路径(“投影”)
公共类项目管理器{
@注入
私人项目道项目道;
@得到
@生成(“应用程序/json”)
公共集合getAllProjections(){
返回projectionDAO.getAllProjections();
}
}
以下是项目DAO:

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

}
package cinema.dao;
导入java.util.Collection;
导入javax.inject.Singleton;
导入javax.persistence.EntityManager;
导入javax.persistence.NoResultException;
导入javax.persistence.PersistenceContext;
导入电影院、模型、投影;
导入cinema.model.User;
@独生子女
公共类项目{
@持久上下文
私人实体管理者;
公共集合getAllProjections(){
返回em.createNamedQuery(“getAllProjections”,Projection.class).getResultList();
}
公共空间投影(投影){
em.persist(投影);
}
公共投影findProjectionByMovieTitle(字符串movieTitle){
试一试{
返回em.createNamedQuery(“getProjectionByMovieTitle”,Projection.class)
.setParameter(“movieTitle”,movieTitle).getSingleResult();
}捕获(noresulte异常){
返回null;
}
}
公共作废购买票(投影,用户){
Projection foundProjection=findProjectionByMovieTitle(Projection.getMovieTitle());
if(foundProjection!=null){
user.getCurrentProjections().add(projection);
int newFreeSpaces=foundProjection.getFreeSpaces()-1;
foundProjection.setfreespace(newfreespace);
}
}
}

投影是一个简单的模型,它给出电影院中不同投影的电影标题和开始时间

您的问题没有说明重要的信息,例如正在使用的版本或您将如何部署,所以我要大胆尝试一下

  • 部署中没有包含
    beans.xml
    文件。但我不确定您是在部署WAR还是JAR文件
  • 假设您有一个正确放置的
    beans.xml
    文件,尝试用
    @ApplicationScope
    交换
    @Singleton
    。这将更正确地发现您的类

  • 如果这是同一场战争。使用applicationscoped和singleton注释投影,或者在注入点使用“@ejb”而不是“@inject”