Java 让所有@PostConstruct在getter之前调用

Java 让所有@PostConstruct在getter之前调用,java,jsf,jsf-2,Java,Jsf,Jsf 2,在JSF2中,我需要一个bean ClassA在后构造期间由ClassB更新, 然后显示更新后的值。 我的问题是,类A的getter在类B后构造之前被调用 我的输出: 瓦尔克斯: 山谷:托托 瓦尔克斯:42 我想要的输出: ValX:42 山谷:托托 瓦尔克斯:42 在构建视图id之前不创建所有bean是正常的吗 在调用ClassA的getter之前更新ClassA的正确解决方案是什么 封装测试; 导入java.io.Serializable; 导入javax.annotation.PostCo

在JSF2中,我需要一个bean ClassA在后构造期间由ClassB更新, 然后显示更新后的值。 我的问题是,类A的getter在类B后构造之前被调用

我的输出:
瓦尔克斯:
山谷:托托
瓦尔克斯:42

我想要的输出:
ValX:42
山谷:托托
瓦尔克斯:42

在构建视图id之前不创建所有bean是正常的吗

在调用ClassA的getter之前更新ClassA的正确解决方案是什么

封装测试;
导入java.io.Serializable;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ViewScoped;
@ManagedBean
@视域
公共类ClassA实现了可序列化{
私有字符串valX;
@施工后
公共void init(){
System.out.println(“init ClassA”);
}
公共字符串getValX(){
System.out.println(“get ValX”);
返回值;
}
公共void setValX(字符串valX){
System.out.println(“设置值”);
this.valX=valX;
}
}
封装测试;
导入java.io.Serializable;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ManagedProperty;
导入javax.faces.bean.ViewScoped;
@ManagedBean
@视域
公共类ClassB实现了可序列化{
@ManagedProperty(value=“#{classA}”)
私人甲级;
私有字符串valY=“toto”;
@施工后
公共void init(){
System.out.println(“init ClassB”);
类别A.setValX(“42”);
}
public ClassA getClassA(){
返回A类;
}
公共无效setClassA(ClassA ClassA){
this.classA=classA;
}
公共字符串getValY(){
返回谷;
}
公共空谷(弦谷){
this.valY=valY;
}
}

ValX:#{classA.ValX}
谷:{classB.ValY}
ValX:#{classA.ValX}
您可以从ClassA的构造函数初始化classB,以便 类B的后构造函数将在类A的 调用后构造函数

首先创建类的一个对象。即调用构造函数

然后,与类固定在一起的后构造函数将在创建对象之后自动执行

类中的任何其他函数,无论是getter、setter还是普通函数,都只能使用已创建的对象调用


如果要在创建类的对象之前调用函数,则必须将函数声明为静态函数。在所有其他方面,getter将被称为

这不是一个答案,但你到底为什么想要这个?如果你解释这个用例,有人可能会给你一个不那么有代码味道的替代方案。说到这里:JSF解析您的xhtml,并从中生成表示EL表达式的对象。它们在不同的时间得到计算,并且没有保证顺序。@mabi:in-facts类用于显示在其他bean初始化期间发生的错误。它是ui:composition使用的xhtml文件的一部分,因此它不了解其他bean,但必须由它们进行更新。
classA
是否做了
FacesMessage
未涵盖的事情?您可以使用omnifaces的帮助器使为前端添加新消息变得非常容易。如果有更多的逻辑,我会添加CDI事件,并让
classA
通过
@Observe
方法监听它们。我尝试了消息,但如果o:messages标记在ValY:#{classB.ValY}之前,消息会被视为未处理(并且不会在生产环境中显示)。我没有使用CDI进行测试,但我认为bean的更新将在调用getter之后进行,就像ClassB调用classA.setValX()一样。在使用classA的属性之前,您需要做的唯一一件事是绑定ClassB的任何属性。在我的情况下,classA不了解ClassB,因为可能有多个类执行此操作,但不是在所有视图中。(我刚刚添加了一条注释来解释我的用例)