@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,这里有云:
- 我所有的代码是在一个单一的
jar
文件。这是一个Maven模块,它将与Web模块(war
包)一起部署在Glassfish服务器4.1中。 - 的
beans.xml
仍然还不存在,因为项目还没有准备好进行部署(我没有执行还没有任何集成测试) - 的
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)
通过接口创建接口和'@Inject'。 – Geinmachi
您是否尝试将@LocalBean添加到您的课程中? –
@Geinmachi,据我了解,当bean是本地的时候,你可以省略接口。我也见过其他项目工作的结构相同,我认为情况并非如此。告诉我你是否需要关于该项目如何获得另一个可能的问题的更多信息。 –