2012-04-19 7 views
0

メンテナンス画面でAutoconverter(forceSelection = false)を実装しました。 既存のレコードを編集するには、ユーザーはオートコンプリートリストからIDを選択します。JSF Converterの実装

新しいレコードを追加するには、同じボックスに新しいIDを入力します。

コンバータでは、IDを使用してDB内のレコードを検索しようとします。
指定されたIDを持つ新しい空のオブジェクトが作成され、重複を避けるために、このオブジェクトはConverterで管理されている配列リストに追加されます。

これは、単一のブラウザセッションで期待どおりに動作します。しかし、複数のブラウザでテストしているうちに、Arrayリストはすべてのインスタンスで共有されています。

アプローチが正しいかどうかはわかりませんが、あなたが私に別のアプローチを提案していただけない場合は、

private List<SchoolMasterDetails> schoolMasterDetailsDB = new ArrayList<SchoolMasterDetails>(); 


@Override 
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) { 
SchoolMasterDetails selectedObject = null; 

System.out.println("getAsObject ==> Entering."); 
System.out.println("getAsObject ==> '" + submittedValue + "'"); 

if (!submittedValue.trim().equals("")) { 
    selectedObject = (SchoolMasterDetails) getMasterService().getSchoolbyCode(submittedValue); 

    if (selectedObject == null) { 
     // search Object on localDB 
     for (SchoolMasterDetails p : schoolMasterDetailsDB) { 
      if (p.getSchoolCode().equalsIgnoreCase(submittedValue.trim())) { 
       System.out.println("getAsObject from ArrayList ==> " + p); 
       return p; // return selectedObject from list of created objects 
      } 
     } 

     System.out.println("getAsObject ==> selectedObject is null, Hence Creating new Object"); 
     selectedObject = new SchoolMasterDetails(); 
     selectedObject.setSchoolCode(submittedValue.trim()); 
     selectedObject.setSchoolName("TEST TEST TEST"); 
     schoolMasterDetailsDB.add(selectedObject); 
    } 
    else { 
     System.out.println("getAsObject from Database ==> " + selectedObject); 
    } 
} 
System.out.println("getAsObject ==> " + selectedObject); 
} 
System.out.println("getAsObject ==> Exiting.");  
return selectedObject; 
} 

よろしく、

Shirish

答えて

1

は、私の知る限り、この(まだ自分自身を学ぶ)を理解し、コンバータは、1つの目的を果たす:それは(getAsStringビューで使用するカスタムオブジェクトを準備します)、文字列をオブジェクト(getAsObject)に変換します。入力(ラジオ・リスト、テキストフィールド、オートコンプリート)が、カスタム・オブジェクトのタイプであるバッキングBeanの変数に関連付けられている場合に使用されます。あなたのオブジェクトを表現するためにどんなStringが使われるべきか、そしてこのStringをどのように使ってオブジェクトをルックアップするかは自由に決めることができます。

これを念頭において、私はオブジェクトのローカルリストを格納するコンバータを使用せず、作成プロセス自体を処理させません。代わりに、私はあなたのデータオブジェクトを保持し、すべてのあなたのロジックの世話をするどこかにバッキングビーンがあると仮定したいと思います。このBeanには、それが含んでいるオブジェクト(あなたのやり方に似ています)を照会できるschoolMastersのリストがあります。次に、見つからない場合を処理し、常に有効なオブジェクト(新しいものかもしれません)を返すような方法でルックアップを実装するか、コンバーターのnot-found-caseをキャッチしてトリガーしますBeanから新しいインスタンスを取得するためのcreateNew()

IMHOこれは、インスタンスの管理をコンバータの変換目的とはっきりと区別します。また、あなたのコードからは、getMasterService()(ローカルメソッド?)と格納されたArrayListを介して、オブジェクトを参照する2つの場所があるようです。私はこれを手に入れません...


インスタンスを共有しているブラウザの問題については、これは範囲の問題のようです。データを格納および管理するバッキングBeanがアプリケーションスコープ内にある場合、アプリケーションが実行されている限り、同じデータセットが使用可能になります。このデータは、ブラウザ間で利用できます。

一方、セッションスコープにBeanを配置すると、各セッションでBeanの独自のインスタンスが作成され、一意のデータが格納されます。同様に、ビューのスコープ付きBeanは、単一のビューと要求Beanが廃棄され、各HTTP要求ごとに再生成される限り存続します。 How to choose the right scope

ここでの回答は、豆(あなたのデータが通常どこにあるか)について語っています。私はコンバーターについてはわかりませんが、アプリケーション全体で利用可能なクラスとして見ています。各セッションとビューでそれらを使用して翻訳することができます。リストを維持すると、グローバルに使用できる可能性があります。

関連する問題