2014-03-13 28 views
0

在JSF2中,我需要在PostConstruct期間由ClassB更新Bean ClassA, 然後顯示更新後的值。 我的問題是在ClassB是PostConstructed之前調用ClassA的getter。在getter之前調用所有@PostConstruct

輸出我有:
ValX:
VALY:TOTO
ValX:42

我想要的輸出:
ValX:42
VALY:TOTO
ValX:42

在構建視圖ID之前沒有創建所有bean是否正常?

在調用getter之前獲得ClassA更新的正確解決方案是什麼?

package test; 

import java.io.Serializable; 
import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

@ManagedBean 
@ViewScoped 
public class ClassA implements Serializable { 
    private String valX; 

    @PostConstruct 
    public void init() { 
     System.out.println("init ClassA"); 
    } 

    public String getValX() { 
     System.out.println("get ValX"); 
     return valX; 
    } 

    public void setValX(String valX) { 
     System.out.println("set ValX"); 
     this.valX = valX; 
    } 
} 
package test; 

import java.io.Serializable; 
import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.ViewScoped; 

@ManagedBean 
@ViewScoped 
public class ClassB implements Serializable { 
    @ManagedProperty(value = "#{classA}") 
    private ClassA classA; 
    private String valY = "toto"; 

    @PostConstruct 
    public void init() { 
     System.out.println("init ClassB"); 
     classA.setValX("42"); 
    } 

    public ClassA getClassA() { 
     return classA; 
    } 

    public void setClassA(ClassA classA) { 
     this.classA = classA; 
    } 

    public String getValY() { 
     return valY; 
    } 

    public void setValY(String valY) { 
     this.valY = valY; 
    } 
} 
<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html"> 
    <h:head> 
    </h:head> 
    <h:body> 
     ValX: #{classA.valX}<br/> 
     ValY: #{classB.valY}<br/> 
     ValX: #{classA.valX}<br/> 
    </h:body> 
</html> 
+0

這不是一個答案,但爲什麼你要在地球上?如果你解釋一下用例,那麼某人可能會給你一個更少的代碼味道。關於你的觀點:JSF解析你的xhtml,並讓對象代表你的EL表達式。他們會在不同的時間進行評估,而且沒有保證的順序。 – mabi

+0

@mabi:事實上,ClassA用於顯示其他bean初始化期間發生的錯誤。它是由ui使用的xhtml文件的一部分:組合,所以它不知道其他bean,但必須由它們更新。 – rmillet

+0

'classA'做了什麼沒有被'FacesMessage'覆蓋的東西嗎?您可以使用omnifaces的[Messages](http://showcase.omnifaces.org/utils/Messages)助手爲前端添加新消息非常容易。如果有更多的邏輯,我會添加CDI事件並讓'classA'通過'@ Observe'方法來監聽它們。 – mabi

回答

0

您可以從ClassA的的構造函數初始化CLASSB,使 的ClassA的的 後調用構造函數之前CLASSB職位構造函數將被調用。

首先創建該類的一個對象。即構造函數被調用。

然後是與類固定的後構造函數,就像在創建對象後自動執行一樣。

類中的任何其他函數,無論是getter函數還是setter函數或普通函數,都只能使用已創建的對象調用。

如果要在創建類的對象之前調用該函數,則必須聲明一個函數爲靜態函數。在所有其他方面,吸氣劑將被稱爲

+0

在我的情況中,ClassA對ClassB沒有任何知識,因爲可能有多個類來執行此操作,但不是所有視圖。 (我剛添加了一條評論來解釋我的用例) – rmillet

相關問題