转换器类抛出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对此问题的回答 。