java - 无法正确使用(@Inject)

标签 java jakarta-ee cdi

当我尝试使用 @Inject 在管理器中注入(inject)我的 DAO 类,使其能够向当前地址提供 gson 文件时,当我访问特定网址时,我会收到此异常。有人可以解释一下什么吗是问题所在。我认为问题可能来自 @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);
        }
    }

}

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

最佳答案

您的问题没有说明重要信息,例如正在使用的版本或您的部署方式,因此我将采取大胆的尝试。

  1. 您没有在部署中包含 beans.xml 文件。但我不确定您是在部署 WAR 还是 JAR 文件。
  2. 假设您有一个正确放置的 beans.xml 文件,请尝试将 @Singleton 替换为 @ApplicationScope。这应该可以更正确地发现您的类(class)。

关于java - 无法正确使用(@Inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30441563/

相关文章:

java - 用于取消多个数组嵌套的 Jooq 表示法

java - 如何检测一个 Set of Sets 是否包含另一个 Set?

hibernate - 使用非事务性 EJB "read"方法是否是一种好的做法?

java - JBoss EAP 6.4 -> 7.1 使用 hibernate 4 而不是默认的 hibernate 5

java - 从基类引用调用时,扩展类中的 CDI 拦截器不起作用

java - Glassfish 4,CDI 中的简单示例因 WELD-001408 Unsatisfied dependencies 而失败

java - 两个 OutputStream 而不是一个?

java - 使用观察者模式

java - 有什么办法可以在运行时将字符串存储在 context.xml 中?

glassfish - 防止钝化是 glassfish 4 中的有状态 session bean