2

MVCに関してJSF @PostConstruvtorが呼び出される前に、プロパティを初期化しようとしています。

これは私のJavaコードです:

@ManagedBean
public abstract class FooController {
    protected <type> prop;

    public void setProp(<type> prop) {
        this.prop = prop;
    }

    public <type> getProp() {
        return this.prop;
    }
}

@ManagedBean
public class Foo1Controller extends FooController {
    private <otherType> myProp;

    @PostConstructor
    public void init {
        myProp = prop.getProp().getOtherTypeProp();
    }
}

[here I have more FooControllers Foo2Controller, Foo3Controller, Foo4Controller...]

@ManagedBean
public class MainController {
    // all props have getters and setters
    private FooController fooController;
    private int controllerType;
    private List<SelectItem> myTypes;
    private <type> prop;

    @PostConstructor
    public void init {
        // init myTypes here
        // init prop here
    }

    public static Object getBean(String s) {
        FacesContext context = FacesContext.getCurrentInstance();
        return context.getApplication().evaluateExpressionGet(context, "#{" + s + "}", Object.class);
    }

    public void controllerTypeChange (ValueChangeEvent event) {
        controllerType = Integer.valueOf(event.getNewValue().toString());

        if (controllerType == 1)
            fooController = (Foo1Controller) getBean("foo1Controller");
        else if (controllerType == 2)
            fooController = (Foo2Controller) getBean("foo2Controller");
        ....

        fooController.setProp(this.prop);
    }
}

そして、これは XHTML です:

<o:SelectOneMenu id="fooType"
    value = #{"MainController.controllerType"}
    valueChangeListener = "#{MainController.controllerTypeChange}"
    styleClass = "dropdown">
    <o:ajax action = "#{MainController.controllerTypeChange}">
    <f:selectItems value = "MainController.myTypes">
</o:selectOneMenu>

<h:panelGroup id="component1" rendered="#{MainController.controllerType == 1}">
    <!-- some component here that uses foo1Controller as it's controller -->
</h:panelGroup>

<h:panelGroup id="component2" rendered="#{MainController.controllerType == 2}">
    <!-- some component here that uses foo2Controller as it's controller -->
</h:panelGroup>

問題は、MainController Bean で foo1Controller を作成しているときに、foo1Controller @postConstructor で prop 属性を既に使用しているが、この属性はまだ初期化されておらず、前にそれを行う方法がわからないため、NULL になっていることです。ポストコンストラクターが呼び出されます。私がやろうとしていることの背後にある概念は、MainController は子コンポーネントを 1 つだけ持つことができ、また持つべきであり、それらはすべて共通点が多いため、ここで継承を行う必要があるということです。ユーザーがドロップダウンで値を選択すると、相対的なコンポーネントが表示され、MainController にはコンポーネント コントローラーへの参照が必要です。

どんな助けも非常に高く評価されます。ありがとう!

4

1 に答える 1