1

列挙型は次のように定義されます。

public enum Country {
    US("United States"),
    CA("Canada"),
    AUS("Australia");

    private String fullName;

    private Country(String fullName) {
        this.fullName = fullName;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }
}

モデルは次のとおりです。

public class Workspace implements Serializable {
    // ...
    @Valid
    @NotNull
    private Address address;
    //...
}

public class Address implements Serializable {
    // ...
    private Country country;
    //...
}

私はそのようなビューオブジェクトを持っています:

public class WorkspaceVO implements Serializable {
    //..
    private Workspace workspace;
    //...
}

そして最後に私のjspで私がやろうとしている:

<form:select id="country"  path="workspace.address.country">
  <form:options items="${workspace.address.country}" itemLabel="fullName"/>
</form:select>

私はこの正確な状況を私のコードの他の場所で複製していて、それはうまく機能しています。違いはわかりませんが、jspにアクセスするとエラーが発生します...

javax.servlet.jsp.JspException:タイプ[com.mycompany.web.Country]はオプションアイテムには無効です

なぜ何かアイデアはありますか?

4

1 に答える 1

1

これは単純な間違いです:form:options itemsすべてのオプションを含むリストの値です!

コントローラーで、モデルマップに変数を追加します

modelMap.add("aviableCountries", Country.values);

そしてそれをjspで使用します:

<form:select id="country"  path="workspace.address.country">
   <form:options items="${aviableCountries}" itemLabel="fullName"/>
</form:select>

編集items:他の解決策は、属性を完全に削除することです

<form:select id="country"  path="workspace.address.country">
   <form:options itemLabel="fullName"/>
</form:select>

その場合、コントローラーに列挙値を追加する必要はありません。これは、spring-form:options-Tag のあまり知られていない機能のために機能します。値の tlditemsでは、次を読み取ることができます。

... この属性(items)は、含まれている select のデータ バインディング用のプロパティが Enum でない限り必須です。Enum の場合は、Enum の値が使用されます。

あなたのコードにはorg.springframework.web.servlet.tags.form.OptionsTag、このif文があります:

if (items != null) {
    itemsObject = ...;
} else {
     Class<?> selectTagBoundType = ((SelectTag) findAncestorWithClass(this, SelectTag.class))
            .getBindStatus().getValueType();
      if (selectTagBoundType != null && selectTagBoundType.isEnum()) {
            itemsObject = selectTagBoundType.getEnumConstants();
      }
}
于 2012-10-04T21:00:34.287 に答える