Компонент @SessionScoped с поведением @ViewScoped

Я испытываю странное поведение с моим bean-компонентом с областью действия сеанса. Я использовал следующие импорты и аннотации, чтобы сделать его сеансовым:

РЕДАКТИРОВАТЬ: больше кода

    import javax.enterprise.context.SessionScoped;
    import javax.inject.Named;

    @Named
    @SessionScoped
    public class DetailsBean implements Serializable {

    private LinkedHashMap<String, String> folder;
    @Inject
    private ApplicationBean appBean;
    @Inject
    private UserBean userBean;

    @PostConstruct
    public void resolveID() {
    this.folder = new LinkedHashMap<String, String>();
    for (LinkedHashMap<String, String> tempfolder : appBean.getRepositoryContent()) {
        if (tempfolder.get("text:nodeid").equals(URLid)) {
            this.folder = tempfolder;
          }
        }
    }

Фрагмент кода страницы JSF:

    <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:rich="http://richfaces.org/rich">
    <f:metadata>
      <f:viewParam name="id" value="#{detailsBean.URLid}" required="true" requiredMessage="You must provide an Object Id"/>
      <f:event type="preRenderView" listener="#{detailsBean.resolveID}" />
    </f:metadata>
    <h:head>
      <title>Dataset #{detailsBean.name}</title>
    </h:head>
    <h:body>
     <h:form>
        <h:panelGrid columns="2" columnClasses="fixed-column">
            Name <h:inputText value="#{detailsBean.name}"
                              id="name" required="true"
                              requiredMessage="name required"/>
            <rich:message for="name" ajaxRendered="true"/>
        </h:panelGrid>
    </h:body>
    </h:form>
    </html>

Теперь, когда я нажимаю ссылку на моей странице jsf, создается экземпляр DetailsBean. Когда я нажимаю на другую ссылку с другим содержимым, используется тот же компонент, потому что я все еще нахожусь в том же сеансе. Теперь странно то, что, хотя я создал 2 разные вкладки браузера, они показывают разное содержимое даже после обновления страницы. Как один и тот же экземпляр компонента может отображать разное содержимое? Я думал, что обычно только bean-компонент @ViewScoped может достичь этого? Не поймите меня неправильно, я ДЕЙСТВИТЕЛЬНО хочу, чтобы они показывали разный контент, поэтому @ViewScoped было бы правильным решением для использования здесь, но мне просто интересно, как это возможно...

EDIT2: когда я использую javax.faces.ViewScoped, вышеприведенный код больше не работает (тогда я получаю java.io.NotSerializableException из-за LinkedHashMap)


person nico1510    schedule 13.11.2012    source источник
comment
Это невозможно, но если у вас есть какая-то логика в вашем бэкере, о которой вы не знаете, тогда это возможно. Пожалуйста, разместите больше кода.   -  person Catfish    schedule 13.11.2012
comment
Хорошо, я отредактировал. Содержимое страницы jsf использует карту папок и получает из нее строки.   -  person nico1510    schedule 13.11.2012
comment
Можете ли вы опубликовать фрагмент кода представления, в котором используется этот вспомогательный компонент?   -  person Catfish    schedule 13.11.2012
comment
Да... Но, кажется, только вид не тот. Когда я делаю изменения на сайте с подробностями, обновляется только последний загруженный сайт   -  person nico1510    schedule 13.11.2012


Ответы (1)


Я считаю, что у вас есть ошибка в строке импорта. import javax.enterprise.context.SessionScoped;. Вы должны импортировать аннотации из javax.faces.bean.SessionScoped.

person piotrsPL    schedule 07.12.2012
comment
OP управляет компонентом с помощью CDI @Named, а не с помощью JSF @ManagedBean. Даже тогда, если бы импорт был действительно неправильным, он по умолчанию использовал бы область запроса и, таким образом, определенно не действовал бы как область видимости. - person BalusC; 07.12.2012