У меня есть страница, которая включает x.xhtml
и проходит 2 ui:param
с.
<p:outputPanel>
<ui:include src="x.xhtml">
<ui:param name="a" value="a" />
<ui:param name="b" value="b" />
</ui:include>
</p:outputPanel>
x.xhtml
, в самом начале объявляет 2 c:set
с, которые устанавливаютпараметры в @ViewScoped
контроллере, называемые current
.
<c:set target="#{current}" value="#{a}" property="a" />
<c:set target="#{current}" value="#{b}" property="b" />
setA(A a)
и setB(B b)
, будут вызваны для установки этих свойств.
@ViewScoped
class CurrentViewController {
private A a;
private B b;
public void setB(B b) { this.b = b; }
public void setA(A a) { this.a = a; }
}
Я ищу место в моем контроллере, где оба параметра были бы готовы. Мне не нужно, чтобы они были свойствами.Они должны инициализировать контроллер.Я бы предпочел не использовать их в шаблоне.Я бы предпочел не иметь их в качестве полей.Я бы предпочел удалить сеттеры.
Проблема в том, что они недоступны из конструктора, метода @PostConstruct
или любого другого известного мне механизма.Они доступны в соответствующих установщиках, но отдельно.
public void setB(B b) {
// I have to check if this.a is already set
if (this.a != null) {
// I can do my initialisation: this.a and b are ready
}
// I have to set a field because setA would do the same trick
}
setA(A a)
будет выглядеть так же безобразно, как и setB(B b)
.Также неясно, какой метод запускает инициализацию.Я думаю, это в основном зависит от порядка параметров в ui:include
.