1

システム(最初のselectonemenu)を選択すると、セクションのドロップダウンが表示されますが、セクションを選択すると、セッターが呼び出されていません。そのため、フォームを送信しましたが、検証エラー値が無効になっています。

<h:outputText value="System" />  
<p:selectOneMenu value="#{moduleManagementController.selectedSystem}" converter="#{applicationSystemConverter}">  
    <f:selectItem itemLabel="Select One" itemValue="" />  
    <f:selectItems value="#{applicationSystems}" var="appsystem" itemLabel="#{appsystem.name}" itemValue="#{appsystem}"/>
    <p:ajax event="change" update="section" listener="#{moduleManagementController.onApplicationSystemChanged}"/>  
</p:selectOneMenu> 

<h:outputText value="Section" />  
<p:selectOneMenu id="section" value="#{moduleManagementController.newModule.section}" converter="#{systemSectionConverter}">  
    <f:selectItem itemLabel="Select One" itemValue="" />  
    <f:selectItems value="#{moduleManagementController.assignableSysSections}" var="section" itemLabel="#{section.name}" itemValue="#{section}"/>  
    <p:ajax event="change" update="addModule"/>
</p:selectOneMenu> 

以下は私のSystemSectionのequalsメソッドです

 public boolean equals(Object obj) {
    if(this == obj) {
        return true;
    } if(obj == null) {
        return false;
    } if(! this.getId().equals(((SystemSection)obj).getId())) {
        return false;
    }
    return true;
}

私のコンバータークラス:

@Override
public Object getAsObject(FacesContext context, UIComponent component,
        String value) {
     if(value == null || "".equals(value)) {
         return null;
     }
     try {
         SystemSection section = systemSectionRepo.findById(Long.valueOf(value));
         return section;
     } catch (NumberFormatException e) {
         return null;
     }
}

/* (non-Javadoc)
 * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
 */
@Override
public String getAsString(FacesContext context, UIComponent component,
        Object value) {  

     if (value instanceof SystemSection)
     {
         return ((SystemSection)value).getId().toString();
     }   
     return "";
}

何が悪いのかわかりません。私が理解したことの1つは、equalsメソッドがfalseを返しているため、setterメソッドが呼び出されていないことです。誰かが私が問題を解決するのを手伝ってくれませんか。

4

1 に答える 1

0

検証エラー値が無効です。

フォーム送信の処理中にequals()、選択したアイテムのテストが現在利用可能なアイテムのいずれに対しても返されない場合、このエラーが発生します。true

したがって、これには2つの原因が考えられます。コンバーターが関与している場合は、3つの原因が考えられます。

  1. equals()が欠落しているか壊れています。
  2. 現在利用可能なアイテムのリストは、フォームの表示のリクエストと比較して、フォームの送信の処理のリクエスト中に互換性なく変更されました。
  3. コンバーターは、に正しい送信値を返しませんでしたgetAsObject()

メソッドとコンバーターはequals()うまく見えるようです。取り残された原因2。要点まで、取り残されたリスト#{moduleManagementController.assignableSysSections}は互換性なく変更されました。どうやらあなたのBeanはリクエストスコープであるか、getterメソッドでビジネスロジックを実行しています。Beanをビュースコープに配置し、getterメソッドでビジネスロジックを実行していないことを確認すると、修正されるはずです。

于 2013-01-25T02:44:10.370 に答える