Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 从豆子中超时_Jsf_Session Timeout - Fatal编程技术网

Jsf 从豆子中超时

Jsf 从豆子中超时,jsf,session-timeout,Jsf,Session Timeout,我希望会话在给定的时间间隔后超时。在web.xml中,我使用了如下代码: <session-config> <session-timeout>20</session-timeout> </session-config> 此处的超时为1200秒,即20分钟。不幸的是,打开浏览器查看应用程序时失败,并显示以下消息: com.sun.faces.mgbean.ManagedBeanCreationException: Cant i

我希望会话在给定的时间间隔后超时。在web.xml中,我使用了如下代码:

<session-config>   
  <session-timeout>20</session-timeout>   
</session-config>   
此处的超时为1200秒,即20分钟。不幸的是,打开浏览器查看应用程序时失败,并显示以下消息:

com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: com.csharp.MyLoginBean. 
其次是:

java.lang.NullPointerException 
我做错了什么?我知道
setMaxInactiveInterval()
指的是特定的会话,在本例中是登录bean,而不是
web.xml
文件中的代码指定的所有内容。我有几个bean,但是超时登录bean是唯一重要的一个


我正在将JSF2.0与GlassFish3.1.1和EclipseIndigo一起使用,因此非常感谢您提供一些建议

NullPointerException的原因非常简单。这是最简单的例外之一。要了解任意异常的原因,只需查看其javadoc。所有Java异常都会在javadoc中解释其原因。以下是一个摘录:

当应用程序在需要对象的情况下尝试使用null时引发。这些措施包括:

  • 调用
    null
    对象的实例方法
  • 访问或修改
    null
    对象的字段
  • null
    的长度视为数组
  • 像数组一样访问或修改
    null
    的插槽
  • 抛出
    null
    ,就好像它是一个可抛出的值一样
应用程序应该抛出此类的实例,以指示null对象的其他非法使用

您的问题是由第1点引起的。这里,

HttpServletRequest request;   
HttpSession session  = request.getSession();   
您试图调用
null
上的
getSession()
方法,而不是具体的
HttpServletRequest
实例。实际上,您应该通过
ExternalContext#getRequest()
获得
HttpServletRequest
,并将其分配给
request

但是,您还有更大的问题:您绝对不应该将当前servlet请求作为会话范围bean的属性(比HTTP请求的寿命更长!)来获取。您应该将它放在线程局部范围内(即完全放在构造函数或方法块内)。您也不应该让JSF托管bean实现
HttpSessionListener
。这毫无意义。您将得到两个实例,一个由容器创建为侦听器,另一个由JSF创建为托管bean

我们应该这样做:

@ManagedBean(name="login")
@SessionScoped
public class MyLoginBean implements Serializable {

    public MyLoginBean() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession();
        session.setMaxInactiveInterval(1200);
    }

    // ...
}
或者,如果您使用的是JSF 2.1,请使用以下提供的:


NullPointerException
的原因非常简单。这是最简单的例外之一。要了解任意异常的原因,只需查看其javadoc。所有Java异常都会在javadoc中解释其原因。以下是一个摘录:

当应用程序在需要对象的情况下尝试使用null时引发。这些措施包括:

  • 调用
    null
    对象的实例方法
  • 访问或修改
    null
    对象的字段
  • null
    的长度视为数组
  • 像数组一样访问或修改
    null
    的插槽
  • 抛出
    null
    ,就好像它是一个可抛出的值一样
应用程序应该抛出此类的实例,以指示null对象的其他非法使用

您的问题是由第1点引起的。这里,

HttpServletRequest request;   
HttpSession session  = request.getSession();   
您试图调用
null
上的
getSession()
方法,而不是具体的
HttpServletRequest
实例。实际上,您应该通过
ExternalContext#getRequest()
获得
HttpServletRequest
,并将其分配给
request

但是,您还有更大的问题:您绝对不应该将当前servlet请求作为会话范围bean的属性(比HTTP请求的寿命更长!)来获取。您应该将它放在线程局部范围内(即完全放在构造函数或方法块内)。您也不应该让JSF托管bean实现
HttpSessionListener
。这毫无意义。您将得到两个实例,一个由容器创建为侦听器,另一个由JSF创建为托管bean

我们应该这样做:

@ManagedBean(name="login")
@SessionScoped
public class MyLoginBean implements Serializable {

    public MyLoginBean() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession();
        session.setMaxInactiveInterval(1200);
    }

    // ...
}
或者,如果您使用的是JSF 2.1,请使用以下提供的:


非常感谢,尤其是我对这件事不太了解。Eclipse抱怨getSession()没有布尔参数,所以我将其设置为真,并通过在很短的超时时间内进行测试来实现。当会话到期时,我如何让用户知道,或者直接转到另一个页面,或者在显示的页面上显示消息?谢谢你的建议,不客气。至于新问题,那是另一个问题。只需搜索(我肯定已经回答了好几次)或问一个新问题。我可以在注释中设置超时吗?非常感谢,特别是我对这方面不太了解。Eclipse抱怨getSession()没有布尔参数,所以我将其设置为真,并通过在很短的超时时间内进行测试来实现。当会话到期时,我如何让用户知道,或者直接转到另一个页面,或者在显示的页面上显示消息?谢谢你的建议,不客气。至于新问题,那是另一个问题。只需搜索(我肯定已经回答了好几次)或问一个新问题。我可以在注释中设置超时吗?