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的一个不为人知的特性。在该items值的 tld 中,您可以阅读:

...除非包含选择的数据绑定属性是枚举,否则此属性(项目)是必需的,在这种情况下使用枚举的值。

在你的代码中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 回答