0

私はEJB3でWicketを使用しています。ページを呼び出すと、ログにエラーが表示されます

Error serializing object class com.mk.view.page.CountryList [object=[Page class = com.mk.view.page.CountryList, id = 91, render count = 1]]
org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException: The object type is not Serializable!
A problem occurred while checking object with type: javax.naming.InitialContext
Field hierarchy is:
  91 [class=com.mk.view.page.CountryList, path=91]
    private javax.naming.Context com.mk.view.page.CountryList.ctx [class=javax.naming.InitialContext] <----- field that is causing the problem

私のコードは

public class CountryList extends Layout {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    /**
     * 
     */


    private javax.naming.Context ctx;
    private GenericCrudService sf;



    private CountryList(){      
        try {

                ctx = new javax.naming.InitialContext();
                sf = (GenericCrudService) ctx
                        .lookup("java:global/mkEar/mkEJB/CrudService!com.mk.business.common.GenericCrudService");

        } catch (NamingException e) {
            e.printStackTrace();
        }

        addModelModule();
        addSearchModule();
    }

私のアプリはクラッシュしません、私はこれらの解決策を見つけられなかったので、これらがログより悪くなるのではないかと思いますか?誰もがこれを解決することを知っていますか?

4

2 に答える 2

1

GenericCrudServiceへの参照をフィールド (またはInitialContextインスタンス)として保持しないでください。検索コードをメソッドにリファクタリングし、サービスが必要になるたびに取得します。再利用できますが、ローカル (変数) またはリクエスト スコープに保持してください。

私の知る限り、JNDI ルックアップから返された EJB がシリアライズ可能であるという保証はありません。たとえそれらがインターフェースを実装し、シリアライゼーション ルールに従っているとしてもです。コンテナーはおそらく、オブジェクト インスタンスを直接返すのではなく、プロキシを返します。

Wicket はリクエスト後にステートフル ページをシリアライズするため、シリアライズ不可能な属性を持つことはできません。これが、発生しているエラーの原因です。

于 2013-01-03T22:11:13.627 に答える
0

また、コンポーネントメソッドでフィールドを一時的にマークし、GenericCrudServiceインスタンスを初期化することもできます。onAttach/onConfigureSpring を使用する場合、Wicket には専用のアノテーション @SpringBean があります。これにより、シリアル化できないサービス フィールドがプロキシになり、インスタンス設定が処理されます。

于 2013-01-06T09:22:17.607 に答える