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 にはコンポーネント コントローラーへの参照が必要です。
どんな助けも非常に高く評価されます。ありがとう!