2

このトピックに関するいくつかの関連する質問を見てきましたが、私が求めているものと完全に一致するものはありません。

ユーザーがチェックボックスリスト(列挙型に基づく)から多数のアイテムを選択できるようにし、それをセットとして受け取ることができるようにしたいフォームがあります。私は以下を持っています(例として日を使用)

私の列挙型:

public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}

オプションとして表示されるコントローラーのページに列挙値を送信します。

model.addAttribute("allDays", Day.values());

オプションをチェックボックスとして記述し、正しいフォーム フィールドにマッピングします。

<form:form method="get" modelAttribute="filterForm" commandName="filterForm">
    <c:forEach items="${allDays}" var="item">
        <form:checkbox path="days" value="${item.name()}" label="${item.name()}"/>
    </c:forEach>
</form:form>

フォームをサポートするフォーム オブジェクト:

public class FilterForm {

    private EnumSet<Day> days;

    public EnumSet<Day> getDays() {
        return days;
    }

    public void setDays(EnumSet<Day> days) {
        this.days = days;
    }
}

これは、オプションが正しく表示される限り機能しますが、送信しようとするとエラーが発生します。

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 エラー フィールド 'days' のオブジェクト 'filterForm' のフィールド エラー: 拒否された値 [0,1]; コード [typeMismatch.filterForm.days,typeMismatch.days,typeMismatch.java.util.EnumSet,typeMismatch]; 引数 [org.springframework.context.support.DefaultMessageSourceResolvable: コード [filterForm.days,days]; 引数 []; デフォルトのメッセージ [日]]; デフォルト メッセージ [タイプ 'java.lang.String[]' のプロパティ値をプロパティ 'days' の必要なタイプ 'java.util.EnumSet' に変換できませんでした。ネストされた例外は org.springframework.core.convert.ConversionFailedException: 値 '{0, 1}' の型 java.lang.String[] から型 java.util.EnumSet への変換に失敗しました。ネストされた例外は java.lang.

問題が何であるか、またはこれを達成するためのより良い方法があるかどうか、何か考えはありますか? ありがとう

4

2 に答える 2

0

実装の代わりにインターフェイスを操作する必要があるだけです。

EnumSet は引き続き使用できますが、宣言ではインターフェイスを使用する必要があります (いずれにせよ、これは良い方法です)。

つまり、Abby's answerで提供されたコードを使用します。次に、次のようなことができます。

filterForm.setDays(EnumSet.allOf(Day.class));
于 2015-04-07T15:13:15.900 に答える