Ответ 1
Это действительно ожидаемое поведение. Слушатели действий (actionListener
, <f:actionListener>
и <f:setPropertyActionListener>
) все вызывается в том порядке, в котором они зарегистрированы на компоненте, сначала с атрибутом actionListener
. Невозможно изменить порядок таким образом, кроме добавления метода actionListener
в качестве <f:actionListener>
(который должен ссылаться на конкретный класс реализации actionListener
).
<p:commandButton ...>
<f:setPropertyActionListener target="#{marketingCodeBean.marketingCode}" value="#{code}" />
<f:actionListener type="com.example.InitForUpdate" />
</p:commandButton>
Лучше всего использовать action
вместо actionListener
. Он вызывается после всех прослушивателей действий. Экшн-слушатели намерены "подготовить" действие, и использовать их для деловых действий на самом деле является плохой практикой.
<p:commandButton ... action="#{marketingCodeBean.initForUpdate}">
<f:setPropertyActionListener target="#{marketingCodeBean.marketingCode}" value="#{code}" />
</p:commandButton>
с
public String initForUpdate() {
// ...
return "update.xhtml";
}
См. также:
- Различия между действием и actionListener - объясняет, когда использовать тот или иной.