我面临一个非常奇怪的问题。事实上,我正在使用具有多个值的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,我有点想法......任何帮助都将受到高度赞赏。
谢谢!
答案 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 ....