2016-02-13 38 views
1

我有一個類,看起來像這樣:如何在用戶類實例化後調用CDI?

@Named 
public class TableView { 

    @PersistenceContext protected EntityManager em; 
    @Resource   protected UserTransaction utx; 

當然,我可以在我的豆建設這樣的過程中獲得一個實例:

@Inject private TableView view; 

我相信這是CDI具有填寫EntityManagerUserTransaction。但是,在我的用戶類實例化後,我有時需要另一個TableView實例,那麼我如何獲得它?顯然

TableView anotherView = new TableView(); 

將無法​​工作,因爲EMUTX將是無效的。那麼如何在進行注射後獲得新的工作實例?

+1

此鏈接可能會解決您的問題.. http://stackoverflow.com/questions/25153624/how-to-instantiate-more-cdi-beans-for-one-class – Ankit

+0

@Ankit這是有趣的,但沒有相當幹。我正在尋找一個運行時API來實例化bean。 – AlanObject

+1

接口['Instance'](https://docs.jboss.org/cdi/api/1.1/javax/enterprise/inject/Instance.html)和方法'get()'。 '實例 tableViewInstance; TableView newInstance = tableViewInstance.get();' – Geinmachi

回答

1

Instance接口應該做你需要的東西:

Instance<TableView> tableViewInstance; 
TableView anotherView = tableViewInstance.get(); 

但正如評論所說,你的觀點不應該有/意識到交易和實體管理。

+0

我的TableView對象是有狀態的DAO,它提供了從數據庫中獲取記錄列表的方法。狀態包括第一條記錄,查詢大小,過濾器,排序等。它應該如何構建CriteriaQueries並在沒有訪問EntityManager的情況下運行它們?有沒有關於JPA和CDI的一些規則? – AlanObject

+0

你是什麼意思「狀態DAO」? EJB'@ Stateful'?你的TableView有'@ Named'註解,所以不是綁定到'xhtml'頁面?如果是這樣,那麼它是表示層,你在'TableView'(事務和EM)中做什麼應該由業務邏輯層(EJB'@ Stateless'或'@ Stateful')通過依賴注入('@ Inject' '@ EJB')。 – Geinmachi

+0

這是JSF web應用程序而不是EJB。後臺bean被注入JSF Servlet的上下文中,而後者需要注入各種數據訪問對象。 – AlanObject

相關問題