2013-02-21 5 views
1

У меня есть p: selectOneMenu на моей странице JSF, и когда я запускаю свою страницу JSF, я получаю следующее исключение из класса конвертера.исключение класса класса throwing java.lang.IllegalArgumentException

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

<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> 

Update 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; 
    } 

Update 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()); 
     } 

    } 
+0

Я не знаю, если это проблема, но у вас есть '# {emp.emploeeNumber}' ошибочно. –

+0

@ XtremeBiker Извините, это была опечатка, я ее исправил. – user75ponic

+0

Можете ли вы указать свой метод getAsObject? –

ответ

2

В вашем методе getAsObject вы ничего не делаете с достигнутым значением. Здесь вы получите свой #{emp.employeeNumber}, поэтому вам нужно преобразовать его в Employee (возможно, вам придется реализовать метод, который загружает Employee с помощью идентификатора службы) и возвращает сам объект.

Вы также ссылаетесь на преобразователь с EL (#{employeeConverter}), вы должны сделать это прямо. Наконец, список элементов должен быть составлен SelectItem, чтобы сделать работу тега f:selectItems.

+0

Не знаю, как я могу это сделать, могу ли я использовать, как' return KeyFactory.stringToKey (значение); 'как указано [здесь] (http://digitaljoel.nerd-herders.com/2010/01/11/jsf- 2-custom-converter /) – user75ponic

+0

Выполняется операция 'employeeService.getEmployees();'. Здесь у вас есть все сотрудники, и ваша ценность удерживает выбранный идентификатор сотрудника. Просто найдите этот идентификатор в своем списке и верните самого сотрудника. Это то, что делают преобразователи, они получают объект из полученной «String». –

+0

Я изменил метод класса class 'getAsObject', добавленный в моем исходном вопросе как обновление 1. Я все еще получаю то же исключение, что и раньше. Я положил инструкцию println в начале метода getAsObject', и это тоже не печатается. Что-то не так с моим измененным методом? Если так любезно сообщите мне. – user75ponic

3

Не назначайте строку к значению элемента, вам нужно присвоить преобразованный объект (Employee) сам.

изменение itemValue="#{emp}"

См BalusC ответ на этот question.

+0

Это не нужно делать вообще. Вы можете передать всю ссылку на объект, как вы говорите, или идентификатор, который пытается выполнить OP, но обязательным условием является то, что вы каким-то образом восстановите объект в конвертере. Посмотрите на это http://digitaljoel.nerd-herders.com/2010/01/11/jsf-2-custom-converter/ –

+1

Что я имел в виду, так это то, что ему нужно восстановить сам объект и назначить его как объект. Вы правы, он может передать идентификатор объекта, но дело в том, что он передает строку, зачем ему нужен конвертер? – fareed

+0

Я действительно предпочитаю передавать всю ссылку на объект как значение, однако реальной проблемой здесь является его метод 'getAsObject'. –

Смежные вопросы