转换器类抛出异常java.lang.IllegalArgumentException [英] Converter class throwing exception java.lang.IllegalArgumentException
问题描述
我在我的JSF页面中有p:selectOneMenu,当我运行我的JSF页面时,我从Converter类中得到以下异常。
I have p:selectOneMenu in my JSF page and when I run my JSF page I am getting the following exception from Converter class.
java.lang.IllegalArgumentException: object 5634 is of type java.lang.String;
expected type: test.entity.Employee
如何解决此问题?
我在实体类中有以下内容
I have the following in Entity class
@Entity
public class Employee implements Serializable {
private String employeeNumber;
private String employeeName;
/* getters and setters */
EmployeeConverter class
EmployeeConverter class
@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页面
<p:selectOneMenu value="#{mb.employee}" converter="#{employeeConverter}">
<f:selectItems value="#{cmb.employeeList}" var="emp"
itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeNumber}"/>
<p:ajax listener="#{mb.handleChange}" process="@this"/>
</p:selectOneMenu>
更新1
修改后的转换器方法 getAsObject
private List<Employee> 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<Employee> emp = getEmployeeService().getEmployees();
employeeList = emp;
}
catch(Exception e){
e.printStackTrace();
System.out.println("exception from loadEmployees "+e.getMessage());
}
}
推荐答案
在 getAsObject
方法中,您对达到的值无效。在这里,您将收到#{emp.employeeNumber}
,因此您必须将其转换为员工
(可能你必须实现一个使用服务定位器通过id加载 Employee
的方法)并返回该对象本身。
In your getAsObject
method you're doing nothing with your reached value. Here you're going to receive your #{emp.employeeNumber}
, so you have to convert it into an Employee
(probably you'll have to implement a method which loads an Employee
by id using service locator) and return the object itself.
您还使用EL引用转换器(#{employeeConverter}
),您必须以直接方式执行此操作。最后,元素列表必须由 SelectItem
组成,以便使 f:selectItems
标记工作。
You're also referencing the convertor with an EL (#{employeeConverter}
), you have to do it in a direct way. Finally, the List of elements has to be composed by SelectItem
, in order to make f:selectItems
tag work.
这篇关于转换器类抛出异常java.lang.IllegalArgumentException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!