Primefaces Autocomplete在页面重新加载后删除值

时间:2016-11-09 13:37:28

标签: spring jsf couchbase

我面临一个非常奇怪的问题。事实上,我正在使用具有多个值的primfaces(6.0)自动完成。 一切都按预期工作,除了一个小问题。一旦我保存了我的数据并重新加载页面(离开范围),看起来一切都很好,但是我的multiselect中的值一旦选择新的值就会消失。 例如,重新加载页面后列表如下所示:

Value1 Value2 Value3

只要现在进入框并选择 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

我做的事情:

  • 我在@PostConstruct方法中复制了列表(自动填充值)以进行检查。他们的名单肯定是正确的。

  • 我检查了itemSelect / itemUnselect事件。在这里值得一提的是,只要触发了itemUnselect-Event,列表就会被设置回空列表

  • 如果我在页面重新加载后只添加/删除项目,那么一切都按预期工作。

我正在使用Spring / Tomcat 8 / JSF2.2 / Couchbase,我有点想法......任何帮助都将受到高度赞赏。

谢谢!

1 个答案:

答案 0 :(得分:0)

没关系,谢谢所有检查过这个问题的人。 解决方案(当然)非常简单。

实际上,couchbase(spring-couchbase)不会在json-object中存储ID(如果注释为@Id)。 (保存为META(桶).id)

这再次意味着,我的对象列表基本上看起来像这样:

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

这个JSON转换成POJO使我的转换器变得毫无用处,因为我希望json看起来像这样:

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

所以,有一个ID。这不是那种情况,而是造成了

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

}

始终返回null ....