我正在使用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();
}
}
我想這是所有我走到這一步。讓我知道你可以得到(或猜測)的任何線索
通過接口創建接口和'@Inject'。 – Geinmachi
您是否嘗試將@LocalBean添加到您的課程中? –
@Geinmachi,據我瞭解,當bean是本地的時候,你可以省略接口。我也見過其他項目工作的結構相同,我認爲情況並非如此。告訴我你是否需要關於該項目如何獲得另一個可能的問題的更多信息。 –