在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>
這不是一個答案,但爲什麼你要在地球上?如果你解釋一下用例,那麼某人可能會給你一個更少的代碼味道。關於你的觀點:JSF解析你的xhtml,並讓對象代表你的EL表達式。他們會在不同的時間進行評估,而且沒有保證的順序。 – mabi
@mabi:事實上,ClassA用於顯示其他bean初始化期間發生的錯誤。它是由ui使用的xhtml文件的一部分:組合,所以它不知道其他bean,但必須由它們更新。 – rmillet
'classA'做了什麼沒有被'FacesMessage'覆蓋的東西嗎?您可以使用omnifaces的[Messages](http://showcase.omnifaces.org/utils/Messages)助手爲前端添加新消息非常容易。如果有更多的邏輯,我會添加CDI事件並讓'classA'通過'@ Observe'方法來監聽它們。 – mabi