У меня есть управляемый JSF-компонент view-scoped, который поддерживает представление xhtml, где я считываю один параметр из URL-адреса, используя f:viewParam.
Представление представляет собой форму для пользователя. Однако, когда пользователь отправляет форму, нажимая p:commandButton, кажется, что bean-компонент с областью видимости воссоздается (я добавил аннотацию @PostConstruct, чтобы убедиться в этом) и поэтому не запоминает переменную экземпляра, считанную из f:viewParam (invId в приведенном ниже коде).
Сначала я перехожу к представлению с помощью команды GET, которая включает параметр URL, но сообщение POST, которое отправляется, когда пользователь нажимает кнопку p. :commandButton не включает параметр URL. Поэтому я думаю, что когда среда выполнения JSF не видит параметр URL в POST, она считает это другим представлением и воссоздает управляемый JSF bean-компонент. Когда я меняю область представления на сеансовую, код работает.
Вот код:
Посмотреть
<f:metadata>
<f:viewParam name="invId" value="#{registerBean.invId}"/>
</f:metadata>
<h:form id="registrationForm">
....
<p:commandButton value="register" action="#{registerBean.register}"
icon="ui-icon ui-icon-newwin" ajax="false"/>
</h:form>
поддерживающая фасоль
@ManagedBean
@ViewScoped
public class RegisterBean implements Serializable {
@ManagedProperty(value="#{invId}")
private String invId;
...
Обновить
Оказывается, это вообще не было связано с параметрами URL. Следуя приведенному ниже совету BalusC, я удалил теги c:when, которые использовал мой вид (вместо этого полагаясь на атрибуты рендеринга для того же эффекта), и теперь bean-компонент с областью просмотра больше не создается заново, а поле invId сохраняется должным образом.
@ManagedProperty
не на месте, я бы избавился от него. Что касается конкретной проблемы, пожалуйста, покажите наименьший возможный фрагмент представления, который воспроизводит именно эту проблему путем простого копирования. Компонент с областью видимости будет воссоздан, когда вы привяжете атрибут обработчика тегов (например,<c:if>
,<ui:include>
и т. д.) к его свойству, но это не видно в опубликованном коде, который кажется слишком упрощенным. Вам необходимо предоставить именно ту информацию, которая вам нужна, чтобы воспроизвести проблему в совершенно пустом проекте со всеми настройками по умолчанию, в том числе самостоятельно. - person BalusC   schedule 08.01.2013