Я пытаюсь отобразить 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: код выбора selectMenu
<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
для извлечения объекта через DTO в методе getAsObject
, в моем примере uniqueness
объекта Attribute
объект - это комбинация type && value
переменных-членов.
Заранее спасибо за любую помощь :)