Несколько возможных решений:
1) Установите тип selectItems на SelectItem[]
вместо и без типизации List
.
или 2) Попробуйте установить var, itemValue и itemLabelатрибуты selectItems, как показано ниже, и поместите фактические объекты версии в ваш список.
или мой любимый, 3) Создайте VersionConverter, который знает, как преобразовать объект Version из и в строку.Пример ниже, если ваш объект Version сохраняется в базе данных и имеет Id.После этого ваши selectedItem и List selectItems должны иметь тип Version (и List), а не String.JSF самостоятельно выполнит преобразование.
@FacesConverter(forClass=Version.class)
public class VersionConverter implements Converter{
public VersionConverter() {
}
@Override
public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
if (value == null || value.length() == 0) {
return null;
}
try {
// Get an EJB that can fetch the Version from a DB. Alternativly, do whatever you need to get your object from a string.
InitialContext ic = new InitialContext();
MyDao myDao = (MyDao)ic.lookup(String.format("java:global/%s/MyBean", (String)ic.lookup("java:module/ModuleName")));
return myDao.findEntity(Version.class, getKey(value));
} catch (NamingException e) {
return null;
}
}
Long getKey(String value) {
Long key;
key = Long.valueOf(value);
return key;
}
String getStringKey(Long value) {
StringBuilder sb = new StringBuilder();
sb.append(value);
return sb.toString();
}
@Override
public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
if (object == null) {
return null;
}
if (object instanceof Version) {
Version e = (Version) object;
return getStringKey(e.getId());
}
else
throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Version.class.getName());
}
}