2016-11-09 9 views
0

非常に奇妙な問題に直面しています。実際には私は複数の値でプリム(6.0)オートコンプリートを使用しています。 少し厄介な問題を除いて、すべてが期待通りに機能します。データを保存してページをリロードすると(スコープを残して)、すべてが良いように見えますが、マルチセレクションの値は新しいものを選択するとすぐに消滅します。例えば、リストは、ページを再読み込みした後、そのように見える :Primefacesページリロード後にオートコンプリートで値が削除される

値1値2値3

とすぐに今のボックスに入力してValue4を選択するリストがそのように見えるよう:

値4

他のすべての値は、最初に存在していても消えます。ここ

いくつかのコード(XHTML)

<p:autoComplete multiple="true" value="#{pricelistItemBean.newPricelistItem.subItems}" completeMethod="#{pricelistItemBean.completeItems}" 
      var="pl" itemLabel="#{pl.name}" itemValue="#{pl}" 
      converter="#{couchbaseEntityConverter}" forceSelection="true" cache="true" > 
<p:column> 
    <h:outputText value="#{pl.name}"/> 
</p:column> 
<p:column> 
    <h:outputText value="#{pl.description}"/> 
</p:column> 

これはコンバータである:

@Named 
@Scope("session") 
public class CouchbaseEntityConverter implements Converter { 

public static final int SIMPLE_CACHE_SIZE = 20; 
private Map<String, CBMain> entities = new HashMap<>(SIMPLE_CACHE_SIZE); 
@Autowired 
CouchbaseRepository couchbaseRepository; 

@Override 
public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    if (value != null && value.length() > 0) { 
     if (entities.containsKey(value)) { 
      return entities.get(value); 
     } else { 
      CBMain entity = couchbaseRepository.findById(value, CBMain.class); 
      if (entities.size() >= SIMPLE_CACHE_SIZE) { 
       List<String> list = new ArrayList<>(entities.keySet()); 
       entities.remove(list.get(list.size() - 1)); 
      } 
      entities.put(value, entity); 
      return entity; 
     } 
    } else { 
     return null; 
    } 
} 

@Override 
public String getAsString(FacesContext context, UIComponent component, Object value) { 
    if (value != null && value instanceof CBMain) { 
     return ((CBMain) value).getId(); 
    } 
    return null; 
} 

public Map<String, CBMain> getEntities() { 
    return entities; 
} 

}

エンティティは、基本的には

@PostConstructようにロードされます3210

私がやったもの:

  • 私はちょうどチェックする@PostConstruct方法でリスト(オートコンプリート値)をコピーしました。リストは間違いなく正しく設定されています。

  • 私は、itemSelect/itemUnselect Eventsを確認しました。ここでは、itemUnselectイベントがトリガーされるとすぐにリストが空のリストに戻されます。

  • ページの読み込み後に項目を追加/削除すると、すべてが次のように機能します。期待される。私は春/ Tomcatの8/JSF2.2/Couchbaseのを使用していますが、私は一種のアイデアが不足しています

..任意のヘルプは高く評価されるだろう。

ありがとうございます!

答えて

0

この問題を確認したみなさん、ありがとうございます。 解決策は(もちろん)非常に簡単です。

実際、couchbase(spring-couchbase)はjsonオブジェクトにID(@Idとして注釈が付けられている場合)を格納しません。 (META(バケット)として保存されます)。

{ 
    prop1:"val1", 
    prop2:"val2", 
    subItems: { 
     prop1:"val1", 
     prop2:"val2" 
    } 
} 

私はそのように見えるようにJSONを期待するのでPOJOに変換し、このJSONは、私のコンバータはかなり役に立たない作っ:

再びオブジェクトの私のリストは、基本的にはそのように見えたことを、意味ID)

subItems: { 
     id: "myId...", 
     prop1:"val1", 
     prop2:"val2" 
    } 

だから、IDを持つ。ただ、その場合ではなかった、それは常にnullを返すために

@Override 
public String getAsString(FacesContext context, UIComponent component, Object value) { 
if (value != null && value instanceof CBMain) { 
    return ((CBMain) value).getId(); 
} 
return null; 

}

の原因となった....

+0

ので、すべてのタグ(春、JSF、tomcatに、primefacesとオートコンプリート)は、実際には無関係ですタグは 'couchbase'だったはずですか? ;-) – Kukeltje

+0

まあ...うん。私は最初に、それはデータで何かするつもりはないと確信していた...あなたは時々間違っているかもしれない...: - / – djnose