JSF ConversationScoped bean-компонент не расширяет область между POST
У меня есть бин с методом действия под названием view() и поле типа MyObject:
@ManagedBean
@ConversationScoped
public class MyBean implements Serializable{
private @Inject Conversation conversation; //has getter and setter
private MyObject object; //has getter and setter
... other fields follow
public String view(MyObject selectedObj){
conversation.begin();
return "success";
}
public String getSomeProperty(){
return object.getProperty();
}
...other methods follow
}
На screen1.xhtml я использую простые лица p:dataTable с var="obj" для вывода строк с помощью commandButton для просмотра объекта строки, по которой щелкает пользователь. Кнопка в каждом ряду выглядит следующим образом.
<p:commandButton action="#{myBean.view(obj)}"
ajax="false" title="View Clone" image="ui-icon ui-icon-locked"/>
Когда пользователь нажимает на кнопку commandButton в одной из строк, они переносятся на страницу page2.xhtml, где отображается более подробная информация об объекте. Это работает правильно и отображает детали. Когда я нахожусь внутри метода действия view(MyObject selectedObj), я немедленно вызываю dialog.begin(), присваиваю this.obj = selectedObj, и пользователь получает page2.xhtml.
Однако, когда пользователь нажимает кнопку commandButton на странице 2, он должен снова отображаться с информацией, отличной от объекта obj, который был назначен из вызова действия view(), который произошел, когда он пришел со страницы 1, поскольку область действия была повышена до уровня диалога. Этого не происходит. Поле obj имеет нулевое значение в bean-компоненте, когда область должна была предотвратить его потерю. Поэтому, когда они нажимают кнопку commandButton на странице 2, она выдает исключение нулевого указателя, когда страница пытается разрешить #{myBean.someProperty}.
Что мне не хватает? Спасибо за любую помощь.
2 ответа
@ConversationScoped - это функция CDI, а не сама JSF. Это означает, что для правильной работы вы должны использовать @ConversationScoped в сочетании с @javax.inject.Named, а не @ManagedBean.
CDI по умолчанию не включен в JSF 2.0 или 2.1, поэтому вам также необходимо добавить реализацию CDI, такую как Weld (см. Http://seamframework.org/Weld) и "empty beans.xml", как описано в сварке. документация.
@ConversationScoped
это аннотация CDI. Если вы используете его, вы никогда не должны использовать @ManagedBean
которая является аннотацией JSF. вместо этого вы должны аннотировать бин @Named
,