【问题标题】:WELD-001408 Unsatisfied dependencies when injecting EntityManagerWELD-001408 注入 EntityManager 时不满足的依赖关系
【发布时间】:2012-07-31 19:58:33
【问题描述】:

我有@Stateless bean,它实现了两个接口(远程和本地)。我还添加了@LocalBean 注释,用于使用无接口视图访问 bean。

@Stateless
@LocalBean
public class WeatherDataBean implements WeatherDataBeanRemote, WeatherDataBeanLocal {
    @Inject
    private EntityManager entityManager;

    public WeatherDataBean () {

    }
    // ....attributes, getter & setter methods ....
}

出于这个原因,我使用@Injectfrom this example of JBoss AS7 quickstart

我们使用来自 CDI 的“资源生产者”模式,将实体管理器的老式 @PersistenceContext 注入“别名”为 CDI 样式注入。这允许我们在整个应用程序中使用一致的注入样式 (@Inject)。

现在我以前用过:

@PersistenceContext(unitName="WeatherStationJPA")
private EntityManager entityManager;

在 EJB 中,它可以正常工作。但是使用@Inject 注释我得到这个错误:

WELD-001408 类型 [EntityManager] 的依赖项不满足 限定符 [@Default] 在注入点 [[field] @Inject private ejb.WeatherDataBean.entityManager]

这是我定义类资源的方式:

public class Resources {
     @SuppressWarnings("unused")
     @PersistenceContext(unitName="WeatherStationJPA")
     @Produces
     private EntityManager entityManager;

     @Produces
     FacesContext getFacesContext() {
         return FacesContext.getCurrentInstance();
     }
}

如果我尝试注入实体管理器,为什么会出现此错误?

编辑: 应@LightGuard 的请求,我正在添加用于引用注释的包:

  1. WeatherDataBean 有:

    import javax.ejb.LocalBean;
    import javax.ejb.Stateless;
    import javax.inject.Inject;
    
  2. 资源有:

    import javax.enterprise.inject.Produces;
    import javax.faces.context.FacesContext;
    import javax.inject.Singleton;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    

【问题讨论】:

  • 一切看起来都正确。你确定你有正确的注释(检查包)吗?也可能取决于你如何包装东西。
  • 请检查我的答案我已经添加了我用于这些注释的包。我正在使用EAR项目打包EJB项目、EJBClient项目、JPA项目和JSF项目。
  • 啊,好吧,如果您使用的是 EAR,情况会有所改变。您必须将进行注入的位置、类所在的库以及 beans.xml 文件所在的位置放置。

标签: dependency-injection java-ee-6 cdi entitymanager stateless-session-bean


【解决方案1】:

我刚刚遇到了同样的问题,我通过将这个类添加到我的项目中解决了这个问题

import java.util.logging.Logger;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * This class uses CDI to alias Java EE resources, such as the persistence context, to CDI beans
 * 
 * <p>
 * Example injection on a managed bean field:
 * </p>
 * 
 * <pre>
 * &#064;Inject
 * private EntityManager em;
 * </pre>
 */
public class Resources {
   // use @SuppressWarnings to tell IDE to ignore warnings about field not being referenced directly
   @SuppressWarnings("unused")
   @Produces
   @PersistenceContext
   private EntityManager em;

  // @Produces
  // public Logger produceLog(InjectionPoint injectionPoint) {
   //   return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
  // }

   @Produces
   @RequestScoped
   public FacesContext produceFacesContext() {
      return FacesContext.getCurrentInstance();
   }

}

【讨论】:

    【解决方案2】:

    我遇到了类似的错误,原来我没有将 beans.xml 文件放在 WEB-INF 文件夹中。 beans.xml 文件可以是位于 WEB-INF 文件夹中的空文件。 JBossAS 检查该文件以启动 CDI 服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多