JSF ConversationScoped bean-компонент не расширяет область между POST - PullRequest
0 голосов
/ 15 августа 2011

У меня есть bean-компонент с методом действия с именем 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 имеет нулевое значение в компоненте, если область должна была предотвратить его потерю. Поэтому, когда они нажимают кнопку commandButton на странице 2, она выдает исключение нулевого указателя, когда страница пытается разрешить # {myBean.someProperty}.

Чего мне не хватает? Спасибо за любую помощь.

Ответы [ 2 ]

3 голосов
/ 25 июля 2012

@ ConversationScoped - это функция CDI, а не сама JSF.Это означает, что для его правильной работы необходимо использовать @ConversationScoped в сочетании с @ javax.inject.Named, а не @ ManagedBean.

CDI по умолчанию не включен в JSF 2.0 или 2.1, поэтомуТакже потребуется добавить реализацию CDI, такую ​​как Weld (см. http://seamframework.org/Weld) и «empty beans.xml», как описано в документации по сварке.

2 голосов
/ 06 декабря 2012

@ConversationScoped является аннотацией CDI .Если вы используете его, вы никогда не должны использовать @ManagedBean, который является аннотацией JSF.вместо этого вы должны аннотировать бин @Named.

...