Java 为什么在JSTL中将此枚举用作选项项时会出现错误

Java 为什么在JSTL中将此枚举用作选项项时会出现错误,java,spring,jstl,el,Java,Spring,Jstl,El,枚举定义为: public enum Country { US("United States"), CA("Canada"), AUS("Australia"); private String fullName; private Country(String fullName) { this.fullName = fullName; } public String getFullName() { ret

枚举定义为:

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


知道为什么吗?

这是一个简单的错误:
表单:选项项
是包含所有选项的列表的值

因此,在控制器中,向modelmap添加一个变量

modelMap.add("aviableCountries", Country.values);
然后在jsp中使用它:

<form:select id="country"  path="workspace.address.country">
   <form:options items="${aviableCountries}" itemLabel="fullName"/>
</form:select>
然后,不需要在控制器中添加枚举值。这是因为
spring表单:options
-Tag的一个不为人所知的特性。在
项的tld
值中,您可以阅读:

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

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();
      }
}
if(项目!=null){
itemsObject=。。。;
}否则{
类selectTagBoundType=((SelectTag)findAncestorWithClass(此,SelectTag.Class))
.getBindStatus().getValueType();
if(selectTagBoundType!=null&&selectTagBoundType.isEnum(){
itemsObject=selectTagBoundType.getEnumConstants();
}
}

这是一个简单的错误:
表单:选项项
是包含所有选项的列表的值

因此,在控制器中,向modelmap添加一个变量

modelMap.add("aviableCountries", Country.values);
然后在jsp中使用它:

<form:select id="country"  path="workspace.address.country">
   <form:options items="${aviableCountries}" itemLabel="fullName"/>
</form:select>
然后,不需要在控制器中添加枚举值。这是因为
spring表单:options
-Tag的一个不为人所知的特性。在
项的tld
值中,您可以阅读:

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

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();
      }
}
if(项目!=null){
itemsObject=。。。;
}否则{
类selectTagBoundType=((SelectTag)findAncestorWithClass(此,SelectTag.Class))
.getBindStatus().getValueType();
if(selectTagBoundType!=null&&selectTagBoundType.isEnum(){
itemsObject=selectTagBoundType.getEnumConstants();
}
}

这有帮助吗?这有用吗?答案的第一部分,您建议将enum添加到modelmap中,这根本不是我想要的……它不需要这样添加。我在其他页面上使用此代码进行了非常类似的设置,就像我在这里所做的一样,效果很好。不过,您的编辑确实给了我一个可行的选择。仍然很奇怪,当我在其他三个页面上有基本相同的代码,并且它们都按预期工作时,它在这个页面上不工作。@kasdega:那么肯定有一些其他的效果,你在问题中没有描述。相信我,我昨天和今天也仔细看过了“弹簧代码”选项标记。@kasdega:如果它在另外两个地方完全是这样工作的,那么很可能是因为您传递给
项的值是
null
而选项标记的行为就像您根本没有设置它一样(我的编辑)因此它会自动使用枚举的值。答案的第一部分,您建议将枚举添加到modelmap中,这根本不是我想要的……不需要这样添加。我在其他页面上使用此代码进行了非常类似的设置,就像我在这里所做的一样,效果很好。不过,您的编辑确实给了我一个可行的选择。仍然很奇怪,当我在其他三个页面上有基本相同的代码,并且它们都按预期工作时,它在这个页面上不工作。@kasdega:那么肯定有一些其他的效果,你在问题中没有描述。相信我,我昨天和今天也仔细看过了“弹簧代码”选项标记。@kasdega:如果它在另外两个地方完全是这样工作的,那么很可能是因为您传递给
项的值是
null
而选项标记的行为就像您根本没有设置它一样(我的编辑)因此,它会自动使用枚举的值。