当前位置: 首页 > 面试题库 >

转换器类抛出异常java.lang.IllegalArgumentException

翟单弓
2023-03-14
问题内容

我的JSF页面中有p:selectOneMenu,当我运行JSF页面时,我从Converter类收到以下异常。

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

我该如何解决这个问题?

我在实体类中有以下内容

@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页面中

 <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},因此您必须将其转换为Employee(可能必须实现Employee使用Service
locator 加载by id的方法)并返回对象本身。

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



 类似资料:
  • 问题内容: 我试图在Netbeans中重构一个大型程序,但我有点迷茫。我从来没有非常模块化,但是现在通过实际学习如何做到这一点来尝试纠正这种情况,并在将来纠正这种情况。不幸的是,我在将某些教程翻译成我的程序时遇到了麻烦。所以我希望这里有人可以帮忙。目前,我正在尝试分解一部分采用特定格式的文件并制成表格的代码。我知道我需要创建一个类并使用它来创建表对象,但是我不确定如何做。我有一个主文件,用于获取文

  • 我正试图在我的窗口中放另一张图表,但我遇到了演员例外。我有一个条形图正在工作,但当我单击按钮将数据添加到线形图时,它会抛出一个异常。下面是代码: 以下是堆栈跟踪: 我需要这个功能,因为我正在尝试将两个图表堆叠在一起。柱状图和折线图。我试图填充折线图的数据不是最终数据。我得到了一个包含数据的列表,我想在折线图上展示这些数据。 编辑这是fxml。

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 问题内容: 我需要将http响应转换为Model,并且响应为纯csv格式: 这让我感到异常: 捕获CSV标头时出错! 该字符串如下所示: 我一直在这里关注以下工作:https : //sourceforge.net/p/opencsv/bugs/196/#ee18 问题答案: 如果您有一个或多个带有参数的构造函数,请在bean类中显式创建一个无参数的构造函数。如果您没有一个或多个带参数的构造函数,

  • 我是jUnit和mockito的新手。对于虚空的嘲弄是如何发挥作用的,我完全感到困惑。在这里,如果名称是“hello”,则函数抛出一个异常。但当我测试它时,它并没有抛出异常... 测试 }

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静