在@Stateless bean中注入时@Inject失败



我在一个使用Java EE 7的项目中工作,需要将一个javax.ejb.@Statelessbean注入另一个。两种豆子都有相似的结构:

@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为null。

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

只是为了做一个小测试,我通过在MenuRepository构造函数中实例化默认的OperationRepository手动注入,但在这种情况下,OperationRepository.entityManager没有注入(为空)

提前感谢您的回答。

编辑#1

按照约翰·阿蒙特的要求,它来了:

  1. 我的所有代码都在一个jar文件中。它是一个Maven模块,将与web模块(war包)一起部署在Glassfish Server 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();
}
}

我想这就是我到目前为止所得到的。让我知道你能得到(或猜测)的任何线索

因为您在CDI容器外进行测试,所以还应该在测试类的@Before方法中手动设置依赖项。

menuRepository.setOperationRepository(operationRepository)