5

JSF で使用する@ViewScopedと、次の例外が発生します。

java.io.NotSerializableException: com.solv.basics.Basics
    java.io.ObjectOutputStream.writeObject0(Unknown Source)
    java.io.ObjectOutputStream.writeObject(Unknown Source)
    java.util.HashMap.writeObject(Unknown Source)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
    java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)

Bean に実装させることで解決できますSerializable。ただし、理屈はわかりません。この例外がビュー スコープでのみ発生し、他のスコープでは発生しないのはなぜですか?

4

2 に答える 2

6

web.xml から設定を提供しませんでしたが、javax.faces.STATE_SAVING_METHODが に設定されている場合client、ビューは常にシリアル化されるため、NotSerializableException常に発生します。

JSF Bean は常にシリアライズ可能にする必要があります。これは、アプリケーション サーバーセッションをシリアライズしたい場合があるため、状態保存が に設定されている場合でも、すべてのセッション スコープおよびビュー スコープの Beanserverです。

ただし、サーバーがセッションをシリアライズしていない場合、セッション スコープ Bean でそのエラーは発生しません。ただし、ビューがクライアントでシリアライズされている場合、ビュー スコープのすべての Bean が、すべてのリクエストで非表示フィールドとして送信される文字列にシリアライズされており、JSF エンジンが Bean がシリアライズ可能でないことを検出していることを意味します。

NotSerializableExceptionサーバーが実際に Bean をシリアライズしようとしたときにのみ発生します。

于 2013-09-25T08:09:56.103 に答える
1

Beanにシリアライゼーションを実装する必要があります

public MyJSFBean implements Serializable{
//Bean coding
}

@ViewScoped Bean では、画面データが 1 つの要求だけでなくビューに対しても有効であるため、これが必要です。@SessionScoped Bean データの場合、データのシリアル化を処理するセッションに格納されます

于 2013-09-25T07:07:51.207 に答える