2015-12-22 3 views
0

У меня есть форма jsf в моем приложении, которая должна отображать несколько полей ввода для создания/редактирования сотрудников. Существует несколько отделов, которые я хочу отобразить с помощью <h:selectOneMenu>. Моими другими компонентами являются в основном компоненты primefaces.Сессия scoped selectOneMenu значение возвращается к умолчанию после обновления страницы

Если я выбираю существующего сотрудника из моего документа, отдел настроен правильно (в интерфейсе и компоненте). Я проверил конвертер и это метод getAsString() в режиме отладки. Оба, похоже, работают нормально.

Но когда я обновляю страницу с помощью [F5], она меняет значение в <h:selectOneMenu> на предыдущую, но значение bean's по-прежнему прекрасное. Кажется, что привязка между моим сеансовым компонентом и компонентом jsf работает некорректно.

Кроме того, есть еще одна проблема, когда я хочу сохранить любого сотрудника. Проверка подтверждает, что значение selectOneMenu недействительно. Эта ошибка возникает после того, как метод getAsObject() успешно возвращает мое подразделение pojo. Я не определял никаких валидаторов для этого конкретного компонента, но я использую несколько компонентов ввода, которые не должны быть пустыми. Эта ошибка может возникнуть из-за проблемы с установкой значения, как указано выше.

DepartmentConverter.java

@ManagedBean(name="departmentConverter") 
public class DepartmentConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     DepartmentDAOImpl deptUtils = new DepartmentDAOImpl(); 

     try { 

      int code = Integer.parseInt(value); 
      return deptUtils.getDepartmentById(code); 

     } catch (NumberFormatException nfe) { 
      System.out.println("Couldn't transform department code from string to int"); 
      nfe.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     return ((Department) value).getCode() + ""; 
    } 

} 

SampleJSFBean.java

@ManagedBean(name = "sampleBean") 
@SessionScoped 
public class SampleJSFBean { 

    private Task employee; 
    private List<Task> employees; 
    private List<Department> departments; 
    private Department department; 

    public String showEditEmployeePanel() { 
     // shows panel 
    } 

    public String updateEmployee() { 
     // saves employee 
    } 

    // getter and setter 

} 

registration.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" 
xmlns:p="http://primefaces.org/ui" template="/templates/BasicTemplate.xhtml"> 

<ui:define name="content"> 

    <h:form id="formResult"> 
     <p:panel> 
      <p:dataTable id="employee" var="task" value="#{sampleBean.employees}"> 
       <p:column headerText="Code"> 
        <h:outputText value="#{task.employee.code}" /> 
       </p:column> 
       <p:column headerText="Name"> 
        <h:outputText value="#{task.employee.lastname}" /> 
       </p:column> 
       <p:column headerText="Department"> 
        <h:outputText value="#{task.employee.department.name}" /> 
       </p:column> 
       <p:column headerText="edit"> 
        <p:commandButton id="btnMut" icon="ui-icon-pencil" title="edit employee" disabled="#{task.jobActive == true}" action="#{sampleBean.showEditEmployeePanel}" 
         update=":formEmployee" resetValues="true"> 
         <f:setPropertyActionListener value="#{task}" target="#{sampleBean.task}" /> 
        </p:commandButton> 
       </p:column> 
      </p:dataTable> 
     </p:panel> 
    </h:form> 

    <h:form id="formEmployee"> 
     <p:growl autoUpdate="false" /> 
     <p:panel id="panelEmployee"> 
      <h:outputText value="Lastname" styleClass="labelForm" /> 
      <p:inputText id="inputLastname" value="#{sampleBean.task.employee.lastname}" required="true" requiredMessage="Please enter lastname." /> 
      <br /> 
      <h:outputText value="Department" styleClass="labelForm" /> 
      <h:selectOneMenu value="#{sampleBean.department}" converter="#{departmentConverter}"> 
       <f:selectItems value="#{sampleBean.departments}" var="dept" itemLabel="#{dept.code} - #{dept.name}" /> 
      </h:selectOneMenu> 
      <br /> 
      <p:commandButton value="save" action="#{sampleBean.updateEmployee}" icon="ui-icon-disk" update=":formResult :formEmployee" /> 
     </p:panel> 
    </h:form> 

</ui:define> 

+1

Итак, вы получили эту точную ошибку? http://stackoverflow.com/questions/9069379/validation-error-value-is-not-valid Другими словами, метод 'equals()' вашего объекта 'Department' отсутствует или сломан? – BalusC

+0

Благодаря BalusC, который спас мой день еще раз! Метод 'equals()' отсутствовал, поэтому мне не удалось сохранить. По-прежнему существует ошибка, потому что компонент всегда показывает старое значение, если я обновляю страницу, но это небольшая ошибка. –

+0

Добро пожаловать :) – BalusC

ответ

-1

Вы попробовали с компонентом правых элементов вместо <h:selectOneMenu> использовать <p:selectOneMenu>. Я не уверен, что это помогает, но я всегда использую selectOneMenu в PrimeFaces и всегда работает.

+0

К сожалению, это имеет тот же эффект, что и при использовании '' –

+0

Причина, почему bean сохраняет старое значение после обновления в '@ SessionScope' для компонентов контроллера Я использую' @Scope ("view") ' – Victor1125

+0

Этот пост больше подходит для комментариев, чем как ответ. У вас достаточно репутации, чтобы публиковать комментарии как реальные комментарии в любом месте. – BalusC

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