4

java.lang.Enumを拡張するクラスにマップするラジオボタンを含むフォームを作成しようとしています。

<s:form action="corp_low_save">
  <s:textfield label="Corporate Client Name" name="name"/>
  <s:radio list="clientStatus.status" name="clientStatus.status"/>
  <s:textfield label="Primary Address Street" name="primaryAddress.street"/>  
  <s:submit />
</s:form>

アクションはModelDrivenを実装し、getModel()を介して次のオブジェクトの新しいインスタンスを利用できるようにします。

public class com...Customer extends java.lang.Object{
    protected java.lang.String name;
    protected com...ClientStatus clientStatus;
    protected com...Address primaryAddress;
    public com...Customer();
    public java.lang.String getName();
    public void setName(java.lang.String);
    public com...ClientStatus getClientStatus();
    public void setClientStatus(com...ClientStatus);
    public com...Address getPrimaryAddress();
    public void setPrimaryAddress(com...Address);
}

関連する残りのクラスは次のとおりです。それらはすべてJAXBによって生成されました。

public class com...ClientStatus extends java.lang.Object{
    protected com...StatusString status;
    protected javax.xml.datatype.XMLGregorianCalendar since;
    protected java.lang.String business;
    public com...ClientStatus();
    public com...StatusString getStatus();
    public void setStatus(com...StatusString);
    public javax.xml.datatype.XMLGregorianCalendar getSince();
    public void setSince(javax.xml.datatype.XMLGregorianCalendar);
    public java.lang.String getBusiness();
    public void setBusiness(java.lang.String);
}

public final class com...StatusString extends java.lang.Enum{
    public static final com...StatusString NEW_CLIENT;
    public static final com...StatusString EXISTING_CLIENT;
    public static final com...StatusString RENEWAL;
    public static com...StatusString[] values();
    public static com...StatusString valueOf(java.lang.String);
    public java.lang.String value();
    public static com...StatusString fromValue(java.lang.String);
    static {};
}

このエラーが発生します:

org.apache.jasper.JasperException:タグ'radio'、フィールド'list'、name'clientStatus.status':要求されたリストキー'clientStatus.status'は、コレクション/配列/マップ/列挙型/イテレータタイプとして解決できませんでした。例:人または人。{名前}

問題が何であるかについてのアイデアはありますか?

編集: 問題はClientStatusがnullであるということだと思います。新しいCustomer()をインスタンス化しただけなので、そのフィールドはnullです。プログラムの2つの部分で重複する情報をエンコードする必要があるため、これは残念です。私はビューでこのようなことをすることができます:

  <s:radio name="clientStatus.status"
       list="#{'NEW_CLIENT':'New Client',
               'EXISTING_CLIENT':'Existing Client',
               'RENEWAL':'Renewal'}"/>

または、コントローラーで、ビューに必要なCustomerのフィールドを明示的にインスタンス化する必要があります。これはまた、特定のJAXBクラスをインスタンス化し、getModel()を介して利用できるようにするだけで、あらゆる種類のJAXBオブジェクトを処理できる一般的なアクションを作成するという私の希望を打ち砕きます。

この不幸な状況から回復する方法について誰かが何か考えを持っていますか?

編集2:最初のフォームを私が期待するものに修正しました。

4

1 に答える 1

1

改訂された回答

エラーメッセージに次のように記載されている場合:

コレクション/配列/マップ/列挙型/イテレータタイプとして解決できませんでした

これはjava.util.Enumeration、列挙型ではなく、を意味します。

そうは言っても、列挙型を使用することはできます。必要なのは、使用可能な値の配列またはコレクションを渡すことだけです。たとえば、ClientStatus.values()は配列を返します。

getClientStatusesすべての値の配列(またはコレクション)を返すというgetterをというアクションに追加するだけです。

元の回答

属性はすべてのlist列挙値を取る必要があります。最初の例では、それが発生しているようには見えません。代わりに、を提供していclientStatusます。それは個々の列挙値ではありませんか?

改訂された例では、list属性にマップを指定しているため、機能しています。

私は通常、アクションで列挙値を公開します。例:getClientStatuses

于 2011-03-02T22:44:49.607 に答える