在JSF2中,我需要在PostConstruct期间由ClassB更新bean ClassA, 然后显示更新的值。 我的问题是在ClassB是PostConstructed之前调用了ClassA的getter。
我的输出:
ValX:
ValY:托托
ValX:42
我想要的输出:
ValX:42
ValY:托托
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 :(得分:0)
您可以从ClassA的构造函数初始化classB,以便 classB的post构造函数将在ClassA之前调用 post构造函数被调用。
首先创建一个类的对象。即构造函数被调用。
然后使用类固定的post构造函数,在创建对象之后自动执行。
类中的任何其他函数,无论是getter,setter还是普通函数,都只能使用已创建的对象调用。
如果要在创建类的对象之前调用该函数,则必须将函数声明为static。在所有其他方式中,将调用getter