【问题标题】:CDI Beans not retaining valuesCDI Beans 不保留值
【发布时间】:2014-03-09 18:46:39
【问题描述】:

我正在处理一个大型 JSF 项目,但注意到我的会话 bean 都没有保留它们的值。为了尝试找出我的错误,我使用简单的注入创建了一个测试项目,但是我仍然发现会话范围的 bean 没有保留其值。

我已通过 stackoverflow.com 搜索(并在 Google 上花了几个小时)寻找答案,但找不到答案。如果有任何帮助,我将不胜感激。

我正在使用 JSF 2.2、Netbeans 7.3.1 和 Glassfish Server 4.0

我的简单测试项目的代码如下。

beans.xml

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:inputText value="#{bean1.title}" />
            <h:commandButton action="#{bean2.test()}" />
        </h:form>
    </h:body>
</html>

Bean1.java

package beans;

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;


@Named(value = "bean1")
@SessionScoped
public class Bean1 implements Serializable {

    public Bean1() {
    }

    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

Bean2.java

package beans;

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;

@Named(value = "bean2")
@RequestScoped
public class Bean2 {

    public Bean2() {
    }

    @Inject
    Bean1 b1;

    public String test()
    {
        System.out.println(b1.getTitle());

        return null;
    }   
}

【问题讨论】:

  • @VasilLukach 我知道javax.faces.bean.SessionScoped 是ManagedBeans 所需的导入,而命名bean(CDI bean)应该使用javax.enterprise.context.SessionScoped
  • 您使用的是什么版本的 JSF?您的应用程序是如何部署的?
  • @JohnAment 我正在使用 JSF 2.2、Netbeans 7.3.1 和 Glassfish Server 4.0

标签: java jsf cdi


【解决方案1】:

如果我不得不猜测,您的 CDI 1.0 beans.xml 会在应用服务器中造成混乱。尝试升级到 CDI 1.1 beans.xml

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
   bean-discovery-mode="all">
</beans>

【讨论】:

  • 感谢@JohnAment 修复了简单的测试项目。不幸的是,尽管两个项目具有相同的配置,但它并没有解决我正在研究的较大项目中的问题。至少我现在知道这是我项目中的一个问题。
  • 好的,如果您想发布更多您的大项目,请随意。
  • 我已将问题缩小到使用 jsf 模板。模板与 CDI bean 不兼容吗?由于某种原因,当我使用模板时,会话 bean 在请求完成后似乎会过期,但是当我删除模板时,会话 bean 会按预期工作。这是您在@JohnAment 之前听说过的吗?
  • 一件奇怪的事情是你分离请求范围和会话范围对象的方式。您是否可以将带有值的 bean 放在会话范围的对象中并在会话范围内调用方法?
  • 我不确定我是否完全理解你的意思@JohnAment。会话范围 bean 是一个用户 bean,它包含有关当前用户的信息。请求 bean 主要用于将用户输入从视图接收到模型,在模型中处理并添加到数据库中。我为此选择了请求范围,因为它只需要在请求的整个生命周期内都存在。注入是必需的,因为我需要根据正确的用户记录在数据库中记录数据。这种糟糕的设计是否有 2 个不同范围的独立 bean?
猜你喜欢
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 2012-07-23
  • 2016-05-16
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多