转换器类抛出异常java.lang.IllegalArgumentException [英] Converter class throwing exception java.lang.IllegalArgumentException

查看:160
本文介绍了转换器类抛出异常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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆