【发布时间】:2019-11-05 15:13:14
【问题描述】:
我正在尝试将list of objects 映射到<p:selectOneMenu(代码如下所示):
Attribute.java
public class Attribute implements Serializable {
private String name;
private String type;
private String value; //getters setters constructors ommitted
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Attribute attribute = (Attribute) o;
return Objects.equals(name, attribute.name) &&
Objects.equals(type, attribute.type);
}
@Override
public int hashCode() {
return Objects.hash(name, type, value);
}
p:selectOneMenu 代码
<p:selectOneMenu label="Existing Attributes" value="#{cellBean.selectedAttributeFromExistings}"
converter="attrConverter">
<f:selectItem itemLabel="Existing attribute" itemValue="#{null}" itemDisabled="true"/>
<f:selectItems value="#{cellBean.allAttributes}" var="attr" itemLabel="#{attr.name}" itemValue="#{attr}"/>
<p:ajax event="change" update="@form" process="@form"/>
</p:selectOneMenu>
属性转换器(attrConverter)代码
@FacesConverter(forClass=Attribute.class, value = "attrConverter")
public class AttributeConverter implements Converter {
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {
String type = s.substring(s.indexOf(":") + 2, s.indexOf(","));
String name = s.substring(s.indexOf("name: ") + 6 , s.length());
Attribute attribute = new Attribute(type, name);
return attribute;
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object attr) {
if(attr == null) {
return null;
}
else{
Attribute attribute = new Attribute();
String s = "";
Iterator iterator = ((LinkedTreeMap)attr).keySet().iterator();
while(iterator.hasNext()){
String key = (String) iterator.next();
String value = (String) ((LinkedTreeMap)attr).get(key);
if(key.equals("name")){
attribute.setName(value);
}
else if(key.equals("type")){
attribute.setType(value);
}
}
return attribute.toString();
}
}
但是,当我从下拉菜单中选择一个值时,出现以下异常
验证错误:值无效:验证错误:值无效
然后在我的屏幕右上角出现错误消息/弹出,知道我做错了什么吗?
PS:我见过很多例子,他们使用unique id 来通过getAsObject 方法中的DTO 检索对象,在我的例子中是uniqueness Attribute 对象是type && value 成员变量的组合。
提前感谢您的帮助:)
【问题讨论】:
-
所以你是说它适用于普通的 jsf
h:selectOneMenu? (和转换器是 JSF 的东西,而不是 PrimeFaces 的东西。 -
在
getAsString中,你的attr 对象是LinkedTreeMap,而getAsObject返回Attribute...。这是不一致的,实际上是错误的。 -
嗨@Kukeltje 感谢您的评论,事实上,在
getAsStringattr 对象是一个LinkedTreeMap 而getAsObject返回一个Attribute是一个不一致(和问题)。错误是我不小心使用gson错误地序列化了一个json,而不是属性列表,而是将其转换为LinkedTreeMap。
标签: jsf primefaces selectonemenu converters