转换器类抛出exceptionjava.lang.IllegalArgumentException

我在我的JSF页面中有p:selectOneMenu,当我运行我的JSF页面时,我从Converter类得到以下exception。

java.lang.IllegalArgumentException: object 5634 is of type java.lang.String; expected type: test.entity.Employee 

我该如何解决这个问题?

我在Entity类中有以下内容

 @Entity public class Employee implements Serializable { private String employeeNumber; private String employeeName; /* getters and setters */ 

EmployeeConverter类

 @Component("employeeConverter") @FacesConverter(forClass = Employee.class) @Inject EmployeeService employeeService; @Override public Object getAsObject(FacesContext facesContext, UIComponent component, String value) { if (value == null || value.length() == 0) { return null; } EmployeeService employeeService= (EmployeeService ) facesContext.getApplication().getELResolver(). getValue(facesContext.getELContext(), null, "employeeService"); return employeeService.getEmployees(); } @Override public String getAsString(FacesContext facesContext, UIComponent component, Object object) { if (object == null) { return null; } if (object instanceof Employee) { Employee emp = (Employee) object; String val = emp.getEmployeeNumber(); return val; } else { throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Employee.class.getName()); } } 

并在jsf页面

  

更新1

修改了Converter方法getAsObject

 private List employee; @Override public Object getAsObject(FacesContext facesContext, UIComponent component, String value) { System.out.println("reached in converter"); try { if (value == null || value.length() == 0) { return null; } else { employee = getEmployeeService().getEmployees(); for (Employee emp : employee) { if (emp.getEmployeeNUmber() == value) { return emp; } } } } catch (Exception e) { System.out.println("exception from getAsObject " + e.getMessage()); } return null; } 

更新2

 ManagedBean @PostConstruct public void loadEmployees(){ try { List emp = getEmployeeService().getEmployees(); employeeList = emp; } catch(Exception e){ e.printStackTrace(); System.out.println("exception from loadEmployees "+e.getMessage()); } } 

在你的getAsObject方法中,你没有对你达到的值做任何事情。 在这里,您将收到#{emp.employeeNumber} ,因此您必须将其转换为Employee (可能您必须实现一个使用服务定位器通过id加载Employee的方法)并返回该对象本身。

您还使用EL( #{employeeConverter} )引用转换器,您必须以直接方式执行此操作。 最后,元素列表必须由SelectItem组成,以使f:selectItems标记起作用。

不要将字符串分配给项目值,您需要分配转换后的对象(Employee)本身。

更改为itemValue="#{emp}"

请参阅BalusC对此问题的回答 。