部門名と役割名を表示する Office データテーブルがあります。部門と役割はオブジェクトです。行編集を選択すると、部門に変更があった場合、ロールを再ロードする必要があります。選択した部門を通過して役割を再レンダリングする方法がわかりません。
<p:column headerText="Department">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{office.department.name}" /></f:facet>
<f:facet name="input">
<p:selectOneMenu value="#{office.department}" converter="#{departmentConverter}" style="width:96%" >
<f:selectItems value="#{departments}" var="dept" itemLabel="#{dept.name}" itemValue="#{dept}"/>
<p:ajax event="change" listener="#{officeManagmentController.onDepartmentChanged()}"/>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Role">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{office.role.name}" /></f:facet>
<f:facet name="input">
<p:selectOneMenu value="#{office.role}" converter="#{roleConverter}" style="width:96%" >
<f:selectItems value="#{officeManagementController.assignableRoles}" var="role" itemLabel="#{role.name}" itemValue="#{role}"/>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
以下は私のofficecontrollerマネージドBeanです
@ConversationScoped
public class OfficeManagementController implements Serializable {
public void onRowSelect(SelectEvent event) {
FacesMessage msg = new FacesMessage(selectedOffice.getName()+" selected");
selectedDepartment=selectedOffice.getDepartment();
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void onDepartmentChanged() {
if(selectedOffice!=null)selectedSystem=selectedOffice.getDepartment();
log.info("Calling onDepartmentChanged " + ((selectedDepartment != null) ? selectedDepartment.getName() : "null"));
if(selectedDepartment != null) {
assignableRoles = roleRepo.findByDepartment(selectedDepartment);
for(int i=0;i<assignableRoles.size();i++){
System.out.println(assignableRoles.get(i));
}
} else {
assignableRoles=null;
}
}
}
私が気づいたのは、onDepartmentChanged() メソッドでは selectedOffice が null ですが、onrowselect では値が null ではないことです。それ以上進んでいません。部署が変わると、役割を動的に変更する必要があります。selectedOffice が null なのはなぜですか?