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
而选项标记的行为就像您根本没有设置它一样(我的编辑)因此,它会自动使用枚举的值。