1

一定の時間間隔が経過した後、セッションをタイムアウトさせたい。web.xmlでは、次のようなコードを使用しています。

<session-config>   
  <session-timeout>20</session-timeout>   
</session-config>   

ここで、20は分単位のタイムアウト期間であり、正しく機能します。

私がやりたいのは、次のように私のBeanの1つで次のようなコードを使用してプログラムで実行することです。

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

    // private variables etc.   

    HttpServletRequest request;   
    HttpSession session  = request.getSession();   

    // Constructor
    public MyLoginBean() {   
        session.setMaxInactiveInterval(1200);   
    }   

// The rest of the code   

}  

ここでのタイムアウトは1200秒、つまり20分です。残念ながら、ブラウザを開いてアプリケーションを表示すると、次のメッセージが表示されて失敗します。

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

に続く:

java.lang.NullPointerException 

私はここで何が間違っているのですか?これは特定のセッションを指していることを知っています。この場合は、ファイル内setMaxInactiveInterval()のコードで指定されているすべてではなく、ログインBeanです。web.xml私はいくつかのBeanを持っていますが、重要なのはログインBeanのタイムアウトだけです。

Glassfish3.1.1とEclipseIndigoでJSF2.0を使用しているので、アドバイスをいただければ幸いです。

4

1 に答える 1

4

にはNullPointerException非常に単純な原因があります。これは最も単純な例外の1つです。任意の例外の原因について知るには、そのjavadocを調べてください。すべてのJava例外には、javadocで説明されている原因があります。これが次のjavadocのNullPointerException抜粋です:

オブジェクトが必要な場合に、アプリケーションがnullを使用しようとしたときにスローされます。これらには以下が含まれます:

  • オブジェクトのインスタンスメソッドを呼び出しnullます。
  • nullオブジェクトのフィールドへのアクセスまたは変更。
  • nullまるで配列のように長さを取ります。
  • nullアレイのようにのスロットにアクセスまたは変更します。
  • スローnull可能な値であるかのようにスローします。

アプリケーションは、このクラスのインスタンスをスローして、nullオブジェクトの他の不正な使用を示す必要があります。

あなたの問題はポイント1によって引き起こされます。ここでは、

HttpServletRequest request;   
HttpSession session  = request.getSession();   

具体的なインスタンスの代わりにgetSession()メソッドを呼び出そうとしています。実際、viaを取得し、に割り当てる必要があります。nullHttpServletRequestHttpServletRequestExternalContext#getRequest()request

ただし、より大きな問題があります。セッションスコープのBean(HTTPリクエストよりも長持ちします!)のプロパティとして、現在のサーブレットリクエストを絶対に取得しないでください。スレッドローカルスコープ内(つまり、完全にコンストラクターまたはメソッドブロック内)に取得する必要があります。また、JSFマネージドBeanにを実装させないでくださいHttpSessionListener。これはまったく意味がありません。最終的に2つのインスタンスが作成されます。1つはコンテナーによってリスナーとして作成され、もう1つは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を使用している場合は、次のものを使用してくださいExternalContext

FacesContext.getCurrentInstance().getExternalContext().setSessionMaxInactiveInterval(1200);
于 2013-01-29T12:15:42.993 に答える