@Inject注入@Stateless bean时失败

问题描述:

我正在使用Java EE 7进行项目工作,我需要将[email protected] bean注入到另一个项目中。这两种豆具有类似的结构:@Inject注入@Stateless bean时失败

@Stateless 
public class OperationRepository extends GenericRepository<Operation> { 

    @PersistenceContext 
    private EntityManager entityManager; 

    public OperationRepository() { 
    } 
    /*Implementation of abstract methods, getters/setters, etc*/ 
} 

@Stateless 
public class MenuRepository extends GenericRepository<Menu> { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @Inject 
    private OperationRepository operationRepository; 

    public MenuRepository() { 
    } 

    /*idem OperationRepository*/ 

    public List<Menu> getMenuFromOperation(...) { 
     // Do something where I need operationRepository 
    } 
} 

GenericRepository<E>仅仅是一些常见的方法和其他抽象方法的抽象类,此处无关紧要。

问题是在getMenuFromOperation()方法中,我得到一个NullPointerException。调试代码我意识到注入的operationRepository在请求方法时为空。

为什么注射点失败?我在这里错过了什么?

只是为了让一个小测试,我手工注入由MenuRepository构造函数实例化一个默认OperationRepository,但在这种情况下,OperationRepository.entityManager没有注入(为null)提前

谢谢您的回答。

编辑#1

按照要求通过John Ament,这里有云:

  1. 我所有的代码是在一个单一的jar文件。这是一个Maven模块,它将与Web模块(war包)一起部署在Glassfish服务器4.1中。
  2. beans.xml仍然还不存在,因为项目还没有准备好进行部署(我没有执行还没有任何集成测试)
  3. MenuRepository@Test类杠杆,因为我还在发展MenuRepository

用于测试类的代码如下:

public class MenuOperationRepositoryUTest extends BaseTestRepository { 
    private MenuRepository menuRepository; 
    private OperationRepository operationRepository; 

    @Before 
    public void initTestCase() { 
     initTestDB(); 

     menuRepository = new MenuRepository(); 
     menuRepository.setEntityManager(em); 
     operationRepository = new OperationRepository(); 
     operationRepository.setEntityManager(em); 
    } 

    @After 
    public void finalizeTestCase() { 
     closeEntityManager(); 
    } 

    /*Some successful tests*/ 

    @Test 
    public void showMenuFromOperation() { 
     // Insert some dummy data into the test DB (HSQL) 

     // This method needs the injected OperationRepository in MenuRepository 
     List<Menu> menu = menuRepository.getMenuFromOperation(...); 

     // Assertions 
    } 
} 

而且BaseTestRepository如下:

@Ignore 
public class BaseTestRepository { 

    private EntityManagerFactory emf; 
    protected EntityManager em; 

    // This is a helper class that contains all the boilerplate to begin transaction 
    // and commit, it's used to insert data in the test DB 
    protected DBCommandExecutor dbCommandExecutor; 

    protected void initTestDB() { 
     // sigeaPU is the name declared in persistence.xml 
     emf = Persistence.createEntityManagerFactory("sigeaPU"); 
     em = emf.createEntityManager(); 

     dbCommandExecutor = new DBCommandExecutor(em); 
    } 

    protected void closeEntityManager() { 
     em.close(); 
     emf.close(); 
    } 
} 

我想这是所有我走到这一步。让我知道你可以得到(或猜测)的任何线索

+0

通过接口创建接口和'@Inject'。 – Geinmachi

+0

您是否尝试将@LocalBean添加到您的课程中? –

+1

@Geinmachi,据我了解,当bean是本地的时候,你可以省略接口。我也见过其他项目工作的结构相同,我认为情况并非如此。告诉我你是否需要关于该项目如何获得另一个可能的问题的更多信息。 –

因为你正在测试出CDI容器,你还应该在测试类的@Before方法中手动设置你的依赖关系。

menuRepository.setOperationRepository(operationRepository)