2013-12-09 29 views
3

我想模塊化我的JSF 2.1/Java EE應用程序。我有一個由幾個模塊組成的頁面。每個模塊應該使用單獨的JSF支持bean。其中一些模塊需要顯示和更改同一個實體上的一些數據。如何在JSF支持bean之間共享實體?

我已經嘗試了一些方法,但到目前爲止我還不滿意。我問自己,做這件事的最好方法是什麼?

所有模塊使用相同的實體,如果某些數據已更改,它們(可能)需要通知其他支持bean。

意見,我已經嘗試了一些方法:

  • 通過接口傳遞實體到我的組件(XHTML)將不會把它傳遞給後臺bean以及
  • 加載的實體通過從請求參數中讀取一個id,bean的postContruct方法通常不鼓勵使用「viewParam」方法
  • 使用「viewParam」是恕我直言,不如在創建bean之後(在我的postConstruct中)具有實體。我不確定何時調用bean的setter。
+0

爲什麼不把實體對象保存在會話中並在所有的bean中使用它。 – Adarsh

+0

我不想膨脹會話。我正在尋找更適合JSF框架的解決方案。在會話中存儲某些內容聽起來像是一種解決方法。 –

+0

當然,你需要一個'@ SessionScoped' /'@ ApplicationScoped'管理bean。關於被通知的豆,你需要更具體。 –

回答

0

儘管它是「普遍灰心」(?由誰),我使用的東西在我的JSF-2.2的支持豆以下技術之一(這取決於我是否需要personId其他東西):

@ViewScoped 
public class BeanConverter { 
    @Inject @Param(name = "personId") 
    private ParamValue<Person> curPerson; 
} 

@ViewScoped 
public class BeanConstruct { 
    @PersistenceContext 
    private EntityManager em; 

    @Inject @Param 
    private ParamValue<Long> personId; 

    private Person curPerson; 

    @PostConstruct 
    public void init() { 
     curPerson = em.find(Person.class, personId.getValue()); 
    } 
} 

這使用了優秀的CDI支持Omnifaces。 然後我使用merge()來更新實體,但在我的情況下,只有一個bean可以保存對實體的更改,所以YMMV。當豆類需要相互通信更新或實體的作品,我通常去javax.enterprise.Event S其中,事件得到實體構造函數的參數:

public class BeanSending { 
    @Inject 
    private Event<PersonCreated> personCreatedEvent; 

    public void constructPerson() { 
     Person person = makePerson(); 
     personCreatedEvent.fire(new PersonCreated(person)); 
    } 
} 

public class BeanUpdater { 
    public void updatePerson(@Observes PersonCreated evt) { 
     doStuffWithPerson(evt.getPerson()); 
    } 
} 
+0

我用「灰心」直接從FacesContext讀取請求參數。它沒有提到你的解決方案注入屬性@Param。 –

+0

@ChristopherCudennec是的,但'@Param'只是(一些非常坦率的)糖。原則是所有的bean都同意一組參數名稱,這樣他們就可以獲得相同的實體。 – mabi

+0

不錯。我喜歡這個值被注入到bean中。另一方面,這個bean知道參數的名字。 –

0

我想你需要什麼是CDI - Context & Dependency Injection。只要把你的頁面切成許多小CDI bean,並根據需要將它們注入彼此。

+0

管理頁面不是我對我的問題感興趣的部分。我所有的支持bean都是可以注入的CDI bean。我有興趣分享實體。假設實體是我從數據庫獲得的客戶。 –

+0

@ChristopherCudennec:如果您已經在使用CDI bean,只需將客戶注入到bean X的一箇中,然後將該bean X注入其他bean以共享同一個客戶。 –

+0

我已經試過了。我更喜歡豆類是自治的,即他們不應該彼此瞭解。 –

相關問題