2012-08-14 1 views
1

primefaces selectOneMenu에 OmniFaces 변환기를 사용하는 데 문제가 있습니다. 부서의 목록을 셀 편집 기능으로 데이터 테이블 datatable에 표시하고 있는데 한 열은 부서 이름을 표시하고 다른 열은 교수 이름을 표시합니다. 편집 할 때 selectOneMenu는 선택할 수있는 기능 목록과 함께 올바르게 표시되지만 제출시 저장되지 않습니다. 데이터 테이블에서 교수진 열을 제거하고 부서 이름이 문제없이 저장되며 누군가 내가 왜 그 이유를 알 수있게 도와줍니다. 교수 이름을 저장할 수 없습니다.Omnifaces Converter를 사용하여 데이터베이스에 selectOneMenu에서 객체를 저장하는 방법은 무엇입니까?

여기

있는 부서 컨트롤러 여기에 다음은 onEdit 방법 공공 무효은 onEdit (RowEditEvent 이벤트) {

try { 
     Department department = (Department) event.getObject(); 
     DepartmentController departmentController = (DepartmentController) FacesContext 
       .getCurrentInstance().getExternalContext().getRequestMap() 
       .get("departmentMB"); 

     departmentController.updateDepartment(department); 

    } catch (Exception e) { 
     e.printStackTrace(); 

    } 
} 

입니다

@ManagedBean(name = "departmentMB") 
@RequestScoped 
public class DepartmentController implements Serializable { 

@ManagedProperty(value = "#{DepartmentService}") 
IDepartmentService departmentService; 


private static final long serialVersionUID = 1L; 

private int department_id; 
private String departmentName; 
private Faculty selectedFaculty; 
. 
. 
.//getters and setters 

내 데이터 테이블 코드 여기

<p:dataTable id="deptTable" var="department" 
     value="#{departmentMB.departmentList}" editable="true" 
     rowIndexVar="rowIndex"> 

     <p:ajax event="rowEdit" listener="#{departmentView.onEdit}" 
      update=":deptForm:messages" /> 

     <p:column headerText="Name"> 
      <p:cellEditor> 
       <f:facet name="output"> 
        <h:outputText value="#{department.departmentName}" /> 
       </f:facet> 
       <f:facet name="input"> 
        <h:inputText value="#{department.departmentName}" /> 
       </f:facet> 
      </p:cellEditor> 
     </p:column> 

     <p:column headerText="Faculty"> 
      <p:cellEditor> 
       <f:facet name="output"> 
        <h:outputText value="#{department.faculty.facultyName}" /> 
       </f:facet> 
       <f:facet name="input"> 
        <p:selectOneMenu id="iterator" 
         value="#{departmentMB.selectedFaculty}" 
         converter="facultyConverter" label="Faculty"> 
         <f:selectItem itemLabel="Select one" noSelectionOption="true" /> 
         <f:selectItems value="#{facultyMB.facultyList}" var="faculty" 
          itemLabel="#{faculty.facultyName}" itemValue="#{faculty}" /> 
        </p:selectOneMenu> 
       </f:facet> 
      </p:cellEditor> 
     </p:column> 

     <p:column> 
      <p:rowEditor /> 
     </p:column> 

    </p:dataTable> 

입니다 업데이트 방법 - 최대 절전 모드 save() 메서드 사용

public void updateDepartment(Department department) { 
    try { 
     getDepartmentService().updateDepartment(department); 

    } catch (DataAccessException e) { 
     e.printStackTrace(); 
    } 

} 

그리고 마지막으로 내 OmniFaces 변환기

@FacesConverter("facultyConverter") 
public class FacultyConverter extends SelectItemsConverter { 
@Override 
public String getAsString(FacesContext context, UIComponent component, Object value) { 
    Integer id = (value instanceof Faculty) ? ((Faculty) value).getFacultyId() : null; 
    return (id != null) ? String.valueOf(id) : null; 
} 

}

+0

콘솔에 오류가 있습니까? – elias

+0

죄송합니다. 분명히 들리지만, 업데이트 메서드를 호출하기 전에'department.setFaculty (selectedFaculty)'가 누락 되었습니까? – elias

+1

@eljunior에는 포인트가 있지만'

'는'# {departmentMB.selectedFaculty} '가 아닌'# {department.faculty}'이어야합니다! 시도 해봐. – BalusC

답변

0

잘못된 질문입니다. JSF는 프리젠 테이션 프레임 워크이며 스토리지/비즈니스 논리를 처리하지 않습니다.

뒷받침 빈에서 적절한 방법으로 저장소를 관리해야하지만 빈이 어디에서 오는 지 무시합니다. 수동 (JDBC) 할 수 있습니다 또는 귀하의 질문은 경우 ORM 프레임 워크 (최대 절전 모드, JPA)

그리고 BTW에, "왜 선택한 객체가 departmentMB.selectedFaculty에 저장되지 않는 이유는 무엇입니까?", 당신의 컨버터는 getAsObject()

+0

답변 해 주셔서 감사합니다. getAsObject()는 Omnifaces 기본 변환기 인 SelectItemsConverter에서 구현되며 변환기에서 확장됩니다. – Silverfish

1
를 구현하지 않습니다

<p:selectOneMenu>에서 부모 백킹 빈이 아니라 현재 반복되는 행에 선택한 교수진을 설정해야합니다. 즉

,이 구체적인 문제는 컨버터에 더 관련이

<p:dataTable ... value="#{departmentMB.departmentList}" var="department"> 
    ... 
    <p:selectOneMenu ... value="#{departmentMB.selectedFaculty}"> 

<p:dataTable ... value="#{departmentMB.departmentList}" var="department"> 
    ... 
    <p:selectOneMenu ... value="#{department.faculty}"> 

로 대체합니다. 그것은 그 일을 잘하고 있습니다.