1

私のアプリケーションサーバーはWebSphereApplicationServerV8です。@EJBアノテーションを使用してEJB(EJB 3.0)を注入したセッションスコープのマネージドBeanがあります。EJBはステートレスです。

   @ManagedBean
   @SessionScoped
    public class MyBean extends BaseBackingBean implements
    Serializable {

@EJB
private IDetails custInfo;

セッションデータを分析していて、NotSerializableExceptionに気づきました

java.io.NotSerializableException: com.ejb.EJSLocal0SLDetailsImpl_081f812d at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) at
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1537) at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1502) at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1420) at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) at 

ここで、EJBを一時的なものとしてマークしようとしましたが、NotSerializableException例外をスローせずに正常に動作します。

@EJB
private transient IDetails custInfo;

これは正しい実装ですか、それとも代替ソリューションになる可能性がありますか?

EJBはインスタンス変数であり、JSFマネージドBeanで一時的なものとしてマークする必要がありますかEJBを一時的なものとしてマークする必要がないと述べられている場合。では、何が間違っている可能性がありますか?

4

1 に答える 1

3

ローカルインターフェイスとリモートインターフェイスの両方を使用してWASV8にPOCコードを実装し、次の点に注意しました。

a。ローカルインターフェイスあり(EJBはSerializableを実装していません)

// Initializing the EJB in the servlet
SerializableTestEJBLocal localSrvlt=new SerializableTestEJB(); 
//Try to serialize
FileOutputStream objFOS = new FileOutputStream("D:\\MYTEST\\testsrv.txt");
ObjectOutputStream objOpStr = new ObjectOutputStream(objFOS);
objOpStr.writeObject(localSrvlt);

これにより、java.io.NotSerializableException:com.ibm.test.SerializableTestEJB at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:.. これを防ぐために、EJBはSerializableを明示的に実装する必要がありました。

b。リモートインターフェースあり(EJBはシリアライズ可能を実装していません)

//Obtain Remote Stub. 
SerializableTestEJBRemote seremoteSrvlt=(SerializableTestEJBRemote)PortableRemoteObject.narrow(homeObject, SerializableTestEJBRemote.class);

//Try serialization
FileOutputStream objFOS = new FileOutputStream("D:\\MYTEST\\testsrv.txt");
ObjectOutputStream objOpStr = new ObjectOutputStream(objFOS); 
objOpStr.writeObject(seremoteSrvlt);

シリアル化は正常に行われました。

結論:

リモートインターフェイスの固有のメカニズムは、このプロキシパターンを使用してクライアント/サーバー通信が発生することを可能にするスタブまたはプロキシを取得することです。これには、データのマーシャリングとアンマーシャリングが含まれるため、プロキシスタブはデフォルトでシリアル化可能であり、EJBはシリアル化可能インターフェイスを実装する必要はありません。

ただし、ローカルインターフェイスには、リモートルックアップとスタブハンドラーは含まれません。EJBの初期化は、ローカルで使用可能なクラスの初期化に似ているため、デフォルトではシリアル化は使用できません。このシナリオでは、EJBがシリアル化可能なインターフェースを実装するか、シリアル化をスキップするためにオブジェクトを一時として宣言する必要があります。

変数を一時的なものとして宣言しています。これはWebSphere固有のソリューションである可能性があります

于 2012-09-04T17:23:36.210 に答える