2013-02-20 3 views
3

Я использую JSF 2.0 с Primefaces 3.4.2<р: selectOneMenu метод слушатель возвращает нуль при выборе значения

У меня есть следующие в JSF странице

<p:selectOneMenu value="#{mb.employee}"> 
    <f:selectItems value="#{mb.employeeList}" var="emp" 
    itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeCode}"/> 
    <p:ajax listener="#{mb.changeMethod}" /> 
</p:selectOneMenu> 

Проблема заключается в том, когда я выбираю значение в selectOneMenu, я получаю null в changeMethod of ManagedBean, для этого System.out.println("val "+employee.getEmployeeName());

В чем причина этого? Как я могу решить эту проблему? Любая гепа очень заметна.

ManagedBean Код

@Named("mb") 
@ViewAccessScoped 
public class MyBean implements Serializable { 

private Employee employee; 
private List<Employee> employeeList; 

@Inject 
EmployeeService employeeService; 

@PostConstruct 
public void loadEmployees() { 
employeeList = employeeService.getEmployees(); 
} 


public void changeMethod() { 
System.out.println("val "+employee.getEmployeeName()); 
} 


/* getters and setters for employee and employeeList */ 
.... methods 
/* */ 

ответ

8

Вы не указываете на <p:ajax> компоненты, которые образуют элементы для обработки, поэтому запрос Ajax может быть отправляете несколько значений, которые могут быть конфликтующие с другой проверки поля. Помните, что если значение отправлено и оно не проходит проверку, то ни одно из значений запроса не будет установлено в модель. Когда вы дойдете до этапа Application (Event), значения модели не будут отражать любые представленные значения запроса.

Попробуйте это:

<p:selectOneMenu value="#{mb.employee}"> 
    <f:selectItems value="#{mb.employeeList}" var="emp" 
    itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeCode}"/> 
    <p:ajax process="@this" partialSubmit="true" listener="#{mb.changeMethod}" /> 
</p:selectOneMenu> 

Вы будете представлять только текущее значение запроса компонента применяются к модели.

EDIT:

На самом деле это, вероятно, не проблема проверки так как нет никаких значений запроса представляется на событие Ajax.

В соответствии с Руководством Primefaces:

процесс пустая строка Компонент (ы) для обработки в частичном запросе.

update null String Компонент (ы) для обновления с помощью ajax.

Вторая колонка - значение по умолчанию. В стандарте атрибут execute по умолчанию равен @this, однако это не относится к <p:ajax>. Если вы хотите отправить текущий компонент, вы должны указать это в атрибуте process.

+0

Я добавил ' user75ponic

+0

@Polppan Должен быть нулевой указатель, возникающий в ваших установщиках свойств или методах getter. Это также может происходить в 'конверторе' для вашего компонента' selectOneMenu'. Вы конвертируете объекты 'employee', не так ли? –

+0

Это потому, что у меня нет класса конвертеров? Да employeeList и сотрудник - это класс сотрудников. – user75ponic

2

Вам нужно добавить конвертер для р: selectOneMenu, чтобы это знать, что вы имеете дело с объектом сотрудника. Создайте класс преобразователя и используйте его с атрибутом . Вот пример конвертера.

import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 
import javax.faces.convert.FacesConverter; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Configurable; 

@FacesConverter("employeeConverter") 
@Configurable 
public class EmployeeConverter implements Converter { 

    @Autowired 
    EmployeeService employeeService; 

    public Object getAsObject(FacesContext context, UIComponent component, 
      String value) { 
     if (value == null || value.length() == 0) { 
      return null; 
     } 
     Long id = Long.parseLong(value); 
     return employeeService.findUser(id); 
    } 

    public String getAsString(FacesContext context, UIComponent component, 
      Object value) { 
     return value instanceof Employee ? ((Employee) value).getId().toString() : ""; 
    } 
} 
+0

Chris Любая причина, почему метод 'getAsObject' не вызывается? Вызывается только метод getAsString'? – user75ponic

+0

** getAsObject ** вызывается, когда данные сохраняются. В это время ** selectOneMenu ** должен вернуть требуемый объект для сохранения. ** getAsString ** вызывается для преобразования пользовательского интерфейса только для просмотра имени или кода или чего-то подобного. –

+0

Крис перед сохранением - есть ли способ проверить, вернёт ли значение 'getAsObject 'правильное значение? – user75ponic

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