2016-05-29 78 views
0

我正在使用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是本地的時候,你可以省略接口。我也見過其他項目工作的結構相同,我認爲情況並非如此。告訴我你是否需要關於該項目如何獲得另一個可能的問題的更多信息。 –

回答

1

因爲你正在測試出CDI容器,你還應該在測試類的@Before方法中手動設置你的依賴關係。

menuRepository.setOperationRepository(operationRepository)

相關問題