【问题标题】:Session Scoped Bean not a Session Scoped BeanSession Scoped Bean 不是 Session Scoped Bean
【发布时间】:2014-01-04 16:53:17
【问题描述】:

我有一个 Primefaces JSF 项目,并且我的 bean 使用以下注释:

@Named("reportTabBean")
@SessionScoped
public class ReportTabBean implements Serializable {
...
}

bean 创建各种选项卡、树等。在用户访问应用程序之前,需要使用 Shiro 框架登录。由于某种原因,每个浏览器会话都共享相同的选项卡、树等以及它们的状态。就像 bean 是应用程序范围一样。我尝试了不同的范围,但没有任何运气。但是,用户主体不是共享的。我得到了正确的登录用户。

我都试过了

@javax.enterprise.context.SessionScoped

@javax.faces.bean.SessionScoped

没有运气。

我做错了什么?

编辑

我使用的是 JDK 1.6.32。

这是其中一颗豆子:

@Named("reportTabBean")
@ViewScoped
public class ReportTabBean implements Serializable {
    private Map<String, TreeNode>   model; //Accordian menu which I want initiated upfront
    private int                     activeReportTypeIndex;
    private TreeNode                selectedNode;
    ....
    @PostConstruct
    public void createModel() {
        model = treeService.createModel();
    }

    public Map<String, TreeNode> getModel() {
        return model;
    }
    ....
    public void tabIsChanged(TabChangeEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        Map<String, String> params = context.getExternalContext().getRequestParameterMap();
        AccordionPanel tabView = (AccordionPanel) event.getComponent();
        String activeIndexValue = params.get(tabView.getClientId(context) + "_tabindex");

        this.activeReportTypeIndex = Integer.parseInt(activeIndexValue);
    }

     public void onNodeSelect(final NodeSelectEvent event) {
        FacesContext.getCurrentInstance().getExternalContext().getSession(true);

        try {
            tabs.add(new ReportListTab(
                event.getTreeNode().getData().toString(),
                reportService.getReports(
                        ((FolderTreeNodeImpl) event.getTreeNode()).getReportType(),
                        ((FolderTreeNodeImpl) event.getTreeNode()).getFolderID()
                        )
                )
                );
         } catch (HibernateException e) {
           LOGGER.error("[onNodeSelect] HibernateException", e);

           FacesContext.getCurrentInstance().addMessage(":messages",
                new FacesMessage(
                        FacesMessage.SEVERITY_ERROR,
                        "Fatal Error",
                        "Please try again. If the error occurs, please contact the administrator."
                )
                );
        }
 }


}

@ViewScoped 是org.omnifaces.cdi.ViewScoped,但我拥有什么范围并不重要。它表现为应用程序范围。如果我在以用户 A 身份登录的 Chrome 中的某一点打开手风琴,则用户 B 的 Firefox 手风琴中的同一点也将打开。手风琴菜单定义如下:

<h:form>                            
        <p:accordionPanel value="#{reportTabBean.model.keySet().toArray()}" var="reportType" activeIndex="#{reportTabBean.activeReportTypeIndex}">

            <p:ajax event="tabChange" listener="#{reportTabBean.tabIsChanged}" />

            <p:tab title="${msg[reportType]}">

                <p:tree value="#{reportTabBean.model[reportType]}" var="node" dynamic="true" 
                    cache="true" selectionMode="single" selection="#{reportTabBean.selectedNode}" id="tree">

                    <p:ajax event="select" update=":tabViewForm" listener="#{reportTabBean.onNodeSelect}" />

                    <p:treeNode type="node" expandedIcon="folder-open" collapsedIcon="folder-collapsed">
                        <h:outputText value="#{node}" />
                    </p:treeNode>

                    <p:treeNode type="leaf" icon="document-node">
                        <h:outputText value="#{node}" />
                    </p:treeNode>

                </p:tree>

            </p:tab>
        </p:accordionPanel>
    </h:form>

以下是我的 POM 依赖项:

<dependencies>
        <!-- OmniFaces -->
        <dependency>
            <groupId>org.omnifaces</groupId>
            <artifactId>omnifaces</artifactId>
            <version>1.6.3</version> <!-- Or 1.7-SNAPSHOT -->
        </dependency>
        <dependency>
            <groupId>com.sun</groupId>
            <artifactId>tools</artifactId>
            <version>1.6</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- R -->
        <dependency>
            <groupId>net.rforge.REngine</groupId>
            <artifactId>REngine</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>net.rforge.Rserve</groupId>
            <artifactId>Rserve</artifactId>
            <version>1.7</version>
        </dependency>

        <!-- Log4J -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <artifactId>log4j</artifactId>
            <groupId>log4j</groupId>
            <type>jar</type>
            <version>1.2.16</version>
        </dependency>

        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
        </dependency>

        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>3.1.4.RELEASE</version>
            <!-- will come with all needed Spring dependencies such as spring-core 
                and spring-beans -->
        </dependency>

        <!-- Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.1.9.Final</version>
            <!-- will come with Hibernate core -->
        </dependency>

        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>el-impl</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>el-api</artifactId>
            <version>6.0.32</version>
            <type>jar</type>
            <scope>provided</scope>
        </dependency>

        <!-- PrimeFaces -->
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>4.0</version>
        </dependency>
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces-mobile</artifactId>
            <version>0.9.4</version>
        </dependency>

        <!-- JSF -->
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.1.7</version>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.1.7</version>
        </dependency>

        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
            <version>3.8.1</version>
        </dependency>

        <!-- Oracle -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>ojdbc6</version>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>xdb</artifactId>
            <version>11.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>xmlparserv2</artifactId>
            <version>11.2.0</version>
        </dependency>

        <!-- Apache Shiro authentication/authorization framework -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-aspectj</artifactId>
            <version>1.1.0</version>
        </dependency>
    </dependencies>

【问题讨论】:

    标签: java spring jsf session primefaces


    【解决方案1】:

    修好了!原来是因为我使用的是 Spring,所以我需要使用 Spring 的范围注释而不是 JSF。

    @Scope("session")
    

    然后

    @SessionScoped
    

    我从this thread找到了解决方案。

    【讨论】:

      【解决方案2】:

      由于您使用的是 @Named,因此您应该使用来自 CDI 的 javax.enterprise.context 包中的 @SessionScoped

      由于某种原因,每个浏览器会话都共享相同的选项卡、树等以及它们的状态。就像 bean 是应用程序范围

      访问同一个 Web 应用程序的每个浏览器选项卡都将共享同一个用户会话,因此 @SessionScoped bean 的行为与 @ApplicationScoped 不同。如果您在不同的浏览器中打开相同的 Web 应用程序,例如Chrome 和 Firefox,您将看到您正在处理两个完全不同的会话。

      根据您的问题描述,您需要使用@ViewScoped。如果您使用的是 Java EE 7,则可以使用 JSF 2.2 附带的这个作用域:@javax.faces.view.ViewScoped。如果您使用的是 Java EE 6 或更早版本,最简单的解决方案是使用 @ViewScoped from OmniFaces(请注意,您至少需要 OmniFaces 1.6),或使用 @ViewScoped from MyFaces CODI

      相关q / as:

      【讨论】:

      • 我确实尝试了 2 个不同的浏览器并以 2 个不同的用户身份登录到网络应用程序,但仍然看到了问题。甚至在不同的计算机上也是如此。我会尝试@ViewScoped 选项。我使用的是 Java EE 6。OmniFaces 会与 PrimeFaces 冲突吗?
      • @raylee OmniFaces 不会与 PrimeFaces 冲突,因为 OmniFaces 是一个 JSF 实用程序库。事实上,OmniFaces 展示是使用 JSF 和 PrimeFaces(以及 OmniFaces)编写的
      • 我从 OmniFaces 实现了@ViewScoped,但共享状态的问题仍然存在。
      • @raylee 那么问题似乎是您在课堂上使用了static 变量。请更新您的问题并添加相关代码以重现错误。
      • 唯一的静态变量是 log4j 记录器和serialVersionUID。没有错误。只是树、手风琴和标签反映了它们的内容(我使用动态内容)和状态。每个页面使用几个 bean。我在 bean 中使范围相同。将使用一些代码和我的 pom 稍微更新一下这个问题。也许图书馆有冲突?
      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 2016-09-09
      • 2013-06-19
      • 2012-05-17
      • 2014-09-07
      • 2015-11-14
      • 2015-03-30
      • 1970-01-01
      相关资源
      最近更新 更多