【问题标题】:Why do I get an error using this enum as option items in JSTL为什么在 JSTL 中使用此枚举作为选项时会出错
【发布时间】:2012-10-04 15:27:54
【问题描述】:

枚举定义为:

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] 对选项项无效

有什么想法吗?

【问题讨论】:

标签: java spring jstl el


【解决方案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 中,您可以阅读:

...这个属性 (items) 是必需的,除非包含 select 的数据绑定属性是 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();
      }
}

【讨论】:

  • 您建议将枚举添加到模型图中的答案的第一部分根本不是我想要的......它不应该以这种方式添加。我已经在其他页面上使用此代码完成了非常相似的其他设置,就像我在这里所做的一样,它工作正常。
  • 您的编辑确实给了我一个可行的选择。当我在其他三个页面上有基本相同的代码并且它们都按预期工作时,它在这个页面上不起作用仍然很奇怪。
  • @kasdega:那么肯定还有一些您在问题中没有描述的其他影响。相信我,昨天和今天我都仔细查看了 springs options 标签的代码。
  • @kasdega:如果它在其他两个地方完全以这种方式工作,那么可能是因为您通过items 传递的值是null 并且选项标签的行为就像您没有设置它一样完全没有(我的编辑),因此它自动使用枚举的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2023-01-29
相关资源
最近更新 更多