2017-06-25 3 views
0

JSF/primefacesをPOJO(名前、idなど)で自動補完して、データを表示し、選択したオブジェクトに関する情報をDBに保存する必要があります。JSF/primefaces POJO itemValueをコンバーターに送る方法を自動補完する

class BackingBean{ 
    POJOClass obj; 

    getters and setters 
} 

POJOクラス

class POJOClass{ 
    String name; 
    int id; 

    getters and setters 
} 

自動補完候補リストに名前を表示する必要性を表示中ですが、idと名前の両方を保存する必要性を節約しながら。コンバータのgetAsObject方法でのみ名を取得

Class MyConverter ... 
{ 
public Object getAsObject(FacesContext fc, UIComponent uic, String value){ 
    String name=value; 
    POJO myPOJO=new POJO(); 
    myPOJO.setName(name); 
    myPOJO.setId(???)//need id information as well over here 
    return myPOJO; 
} 
    public String getAsString(...){ 
    //returns name to display 
    } 
} 

エイブル

Primefacesコード

<p:autocomplete value="#{backingbean.obj}" var="object" itemValue="#{object}" itemLabel="#{object.name}"/> 

コンバータ。 また、名前だけを使用してIDからオブジェクトを取得することはできません。

注:情報を取得するためにDB呼び出しを行いたくないです。

短期的な目的は、コンバータのgetAsObjectまたはPOJOオブジェクト全体のIDを取得することです。これを達成するための他の方法があるかどうかは確かではありません。

私たちはそれをどのように実現したのでしょうか?

注:私はJSF/Primefacesの初心者です。

+0

コンバーターに関する適切なチュートリアルをお読みください。あなたの質問には特別なことはありませんが、そこにはまだありません。 – Kukeltje

+1

https://stackoverflow.com/questions/9147119/avoid-extra-db-reads-in-the-getasobject-method-of-converter-class-by-caching-dat同様の質問(役に立ったと思いますか?) – jNick

答えて

0

要するに、値を保持したいとします。そのためには、jpaのような永続的なapiを使用するか、スコープがアプリケーションレベルであるキャッシュに使用されるようなグローバルオブジェクトにグローバルに保存するだけです。私はあなたが探しているものが第2の選択肢だと思います。 このオブジェクトは、アプリケーションの起動時に初期化されます。

キャッシュでキーが見つかった場合は、値を取得してからdbコールを実行します。

+0

いいえ、私の目的は、コンバータ内のidオブジェクト全体またはPOJOオブジェクト全体を取得することです。 – trying

+0

@trying:しかし、あなたはPojoを** somwehere **から取得する必要があります... DB、キャッシュ、リスト、何でも... – Kukeltje

+0

あなたが探しているものはキャッシュです。あなたはpojoオブジェクト全体を格納できる多くの種類のキャッシュがあります。外部キャッシュが必要な場合は、Redisを試してください。いくつかのAPIが必要な場合は、hibenateまたはjpaを試してください(ここでは2つのレベルのキャッシュがあり、キャッシュされたオブジェクトはDBオブジェクトです)。 –

0

このようなリソースが1つしかない場合は、どのPOJOClassインスタンスが必要かを知ることができます。 EL式は、管理対象環境(コンテナによって管理されるコンバーター)で使用できます。あなたは多くのPOJOClassインスタンスを持っている場合は、隠されたコンポーネントにIDを保存

Class MyConverter ... 
{ 
    public Object getAsObject(FacesContext fc, UIComponent uic, String value) 
    { 
    String name=value; 
    POJO myPOJO=new POJO(); 
    myPOJO.setName(name); 
    myPOJO.setId(getPOJOId()); 
    return myPOJO; 
} 

public String getAsString(...) 
{ 
    //returns name to display 
    } 

    protected int getPOJOId() 
    { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    POJOClass pojo = context.getApplication().evaluateExpressionGet(context, "#{backingBean.obj}", POJOClass.class); 
    return pojo.getId(); 
    } 
} 

とその値にアクセスします。この場合、あなただけのコンバータによって名前フィールドを変換し、EL式を経由してのみ1つのIDにアクセスする必要がありますIDを取得する。

関連する問題