0

アイテムのリストと、編集するアイテムを選択するためのチェックボックスを含む dataTable があります。アイテムにチェックを入れて編集ボタンをクリックすると、フィールドと更新およびキャンセル ボタンを持つコンポーネントがポップアップ表示されます。これが何が起こるかです。

  1. ダイアログが表示されます
  2. すべてのフィールドを空にして [更新] をクリックすると、すべてのフィールドが空であるため必要なメッセージが表示され、データは保存されません
  3. [キャンセル] をクリックすると、ダイアログが消えます
  4. 同じ項目をクリックして再度編集する
  5. 一部のフィールドが表示されていません。データテーブルとデータベースを確認しましたが、アイテムのデータはまだ存在しています。2回目は編集ダイアログに表示されません。

表示されていないフィールドは、NULL 属性を持つフィールドだけであることに気付きました。NOT NULL フィールドは問題ありません。これはセッションと関係があるのだろうか。(すべてのコンポーネントに Primefaces を使用)

編集ダイアログのコード

<p:dialog header="#{bundle.Edit}" modal="true" widgetVar="editDialog" resizable="false">
        <h:form id="edit-form">
          <p:messages id="edit-error" autoUpdate="true" closable="true"/>
          <h:outputLabel value="#{bundle.Name}" for="name" /><span class="required">*&lt;/span>
          <p:inputText id="name" value="#{controller.selected.name}" required="true" requiredMessage="#{bundle.Name}&nbsp;#{bundle.FieldIsRequired}" maxlength="45"/>
          <h:outputLabel value="#{bundle.Input}" for="input" /><span class="required">*&lt;/span>
          <h:selectOneRadio id="input" value="#{controller.selected.input}" required="true" requiredMessage="#{bundle.Input}&nbsp;#{bundle.FieldIsRequired}">
            <f:selectItem itemLabel="◯ " itemValue="0" />  
            <f:selectItem itemLabel="☓ " itemValue="1" />  
          </h:selectOneRadio>
          <h:outputLabel value="#{bundle.IsOption}" for="isOption" /><span class="required">*&lt;/span>
          <h:selectOneRadio id="isOption" value="#{controller.selected.isOption}" required="true" requiredMessage="#{bundle.IsOption}&nbsp;#{bundle.FieldIsRequired}">
            <f:selectItem itemLabel="◯ " itemValue="0" />  
            <f:selectItem itemLabel="☓ " itemValue="1" />   
          </h:selectOneRadio>
          <h:outputLabel value="#{bundle.Remark}" for="remark" />
          <p:inputTextarea id="remark" value="#{controller.selected.remark}"/>

          <p:commandButton action="#{controller.update()}" 
                           value="#{bundle.Save}" 
                           actionListener="#{controller.prepareList()}" 
                           oncomplete="handleEditDialog(xhr, status, args)" 
                           update=":form:datatable :edit-form:edit-error"
                           />
          <p:commandButton value="#{bundle.Cancel}" 
                           onclick="editDialog.hide(); reset();" 
                           type="button"/>
        </h:form>
      </p:dialog>



更新機能のコード

public String update() {
    RequestContext context = RequestContext.getCurrentInstance();
    try {
      current.setUpdateDate(new Date());
      Map<String, Object> param = JsfUtil.getExternal().getSessionMap();
      int createUser = (Integer) param.get("LOGIN_ID");
      Account account = accountFacade.find(createUser);
      current.setUpdateUser(account);
      getFacade().edit(current);
      search();
      prepareList();
      JsfUtil.addSuccessMessage(ResourceBundle.getBundle(JsfUtil.getSessionBundle()).getString("Updated"));
      updateOk = true;
      current = null;
      context.addCallbackParam("updated", true);
      return "";
    } catch (Exception e) {
      if (e.getCause().getCause().getMessage().contains("uk_")) {
        JsfUtil.addErrorMessage("edit-form:edit-error",JsfUtil.getResourceString("Duplicate"));
        context.addCallbackParam("updated", false);
      } else {
        JsfUtil.addErrorMessage(e, ResourceBundle.getBundle(JsfUtil.getSessionBundle()).getString("PersistenceErrorOccured"));
        context.addCallbackParam("updated", false);
      }
      return null;
    }
  }
4

2 に答える 2