Hallo,
ich habe ein Problem mit der JSF Komponente SelectOneMenu. Ich möchte, dass die Werte meiner SelectItems durch Beans dargestellt werden. Ich habe gelesen, dass man sich dafür einen eigenen Konverter schreiben muss, was ich getan habe. Hier erst einmal die Bean die ich benutze:
Der Konverter für die Bean:
Die Methode, in der ich mir die SelectItems zusammen baue:
Und zu guter letzt der Teil der JSF mit dem SelectOneMenu:
Auf der selben Seite habe ich noch ein h:message Feld, das mir bei jedem Submit folgende Fehlermeldung ausgibt:
Validierungs-Fehler: Wert nicht gültig
Hat jemand eine Ahnung woran das liegt? hab ich irgendetwas vergessen oder falsch gemacht?
Ich hab mir schon jede Menge Turoials im Netz angesehen, da wird aber meist nur die Verwendung von SelectOneMenus mit primitiven Datentypen beschrieben, nicht aber die Verwendung mit Beans.
ich habe ein Problem mit der JSF Komponente SelectOneMenu. Ich möchte, dass die Werte meiner SelectItems durch Beans dargestellt werden. Ich habe gelesen, dass man sich dafür einen eigenen Konverter schreiben muss, was ich getan habe. Hier erst einmal die Bean die ich benutze:
Code:
public class Employee implements Serializable{
private int id;
private String name;
private String forename;
public Employee(){
super();
}
public Employee(String name, String forename) {
super();
this.forename = forename;
this.name = name;
}
public String getForename() {
return forename;
}
public void setForename(String forename) {
this.forename = forename;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public String toString(){
return id + "," +name + "," + forename;
}
public void setId(int id) {
this.id = id;
}
}
Der Konverter für die Bean:
Code:
public class EmployeeConverter implements Converter {
public Object getAsObject(FacesContext ctx, UIComponent uiComponent, String value) {
Employee emp = new Employee();
emp.setId(Integer.valueOf(getProperty(value, "id")));
emp.setForename(getProperty(value, "forename"));
emp.setName(getProperty(value, "surname"));
System.out.println("Converter-> Employee: " + emp);
System.out.println("Converter-> value: " + value);
return emp;
}
private String getProperty(String source, String propName){
int idIndex = source.indexOf(propName + "=") + propName.length()+1;
int commaIndex = source.indexOf(",",idIndex);
if(commaIndex < 0) commaIndex = source.indexOf("]");
System.out.println(idIndex);
System.out.println(commaIndex);
return source.substring(idIndex, commaIndex);
}
public String getAsString(FacesContext ctx, UIComponent uiComponent, Object value) {
if(!(value instanceof Employee)) throw new ConverterException();
Employee emp = (Employee)value;
StringBuffer stringValue = new StringBuffer("[id=");
stringValue.append(emp.getId());
stringValue.append(",forename=");
stringValue.append(emp.getForename());
stringValue.append(",surname=");
stringValue.append(emp.getName());
stringValue.append("]");
return stringValue.toString();
}
}
Code:
public Collection<SelectItem> getPmList() {
Collection<SelectItem> selectItems = new Vector<SelectItem>();
Collection<Employee> emps = controler.getEmployeeService()
.getEmployees();
Iterator<Employee> iter = emps.iterator();
while (iter.hasNext()) {
Employee emp = iter.next();
selectItems.add(new SelectItem(emp, emp.getName() + ", "
+ emp.getForename()));
}
return selectItems;
}
Code:
<h:selectOneMenu id="pm" value="#{ProjectEditBean.project.projectManager}">
<f:selectItems value="#{ProjectEditBean.pmList}" />
</h:selectOneMenu>
Validierungs-Fehler: Wert nicht gültig
Hat jemand eine Ahnung woran das liegt? hab ich irgendetwas vergessen oder falsch gemacht?
Ich hab mir schon jede Menge Turoials im Netz angesehen, da wird aber meist nur die Verwendung von SelectOneMenus mit primitiven Datentypen beschrieben, nicht aber die Verwendung mit Beans.