在getter之前调用所有@PostConstruct

时间:2014-03-13 09:33:41

标签: java jsf jsf-2

在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>

1 个答案:

答案 0 :(得分:0)

  

您可以从ClassA的构造函数初始化classB,以便   classB的post构造函数将在ClassA之前调用   post构造函数被调用。

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

然后使用类固定的post构造函数,在创建对象之后自动执行。

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

如果要在创建类的对象之前调用该函数,则必须将函数声明为static。在所有其他方式中,将调用getter