У @PostConstruct
действительно никогда не будет доступа к обновленным значениям модели. Они доступны только после фазы обновления значений модели (таким образом, во время действия вызова и фазы ответа рендеринга). @PostConstruct
никогда не предназначен для выполнения действий с обновленными значениями модели, он предназначен для выполнения действий с внедренными зависимостями, которые, в свою очередь, также создаются заново при необходимости, например @EJB
, @Inject
, @ManagedProperty
.
То, что вы хотите, это метод, который вызывается во время фазы действия invoke. Вам нужно либо выполнить работу в методе прослушивания ajax TestSessionBB
:
@Inject
private TestRequestBB testRequestBB;
public void next() { // No, no need to return String.
// ...
testRequestBB.initialize();
}
Или , чтобы добавить <f:event type="preRenderView">
к представлению. Это позволяет вам выполнять методы bean-компонента в самом конце фазы действия invoke, прямо перед фазой ответа рендеринга. Поместите это где-нибудь на ваш взгляд:
<f:event type="preRenderView" listener="#{testRequestBB.initialize}" />
Не забудьте удалить аннотацию @PostConstruct
из метода.
Что касается проблемы вызова метода @PostConstruct
дважды, то это потому, что каждый @Named
приводит к совершенно отдельному экземпляру. У вас есть два @Named
в одном классе, один в самом классе и один в самом методе получения. Я бы посоветовал удалить один из методов получения и заменить #{testList}
на ваш взгляд на #{testRequestBB.testList}
.
<h:dataTable value="#{testRequestBB.testList}" ...>
Если вам действительно, действительно , нужно получить параметры запроса внутри @PostConstruct
, то вы можете получить их вручную с помощью ExternalContext#getRequestParameterMap()
:
@PostConstruct
public void initialize() {
String foo = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("foo");
// ...
}
Если бы вы использовали аннотацию JSF2 @ManagedBean
вместо аннотации CDI @Named
, вы могли бы вместо этого использовать @ManagedProperty
:
@ManagedProperty("#{param.foo}")
private String foo;
Это значение будет доступно в течение @PostConstruct
. В CDI такой аннотации нет, однако вы можете homegrow сделать ее самостоятельно, если необходимо.
Смотри также: