gpt4 book ai didi

java - 为什么在 JSTL 中使用此枚举作为选项时会出现错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:55 25 4
gpt4 key购买 nike

枚举定义为:

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;
//...
}

我有一个这样的 View 对象:

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

有什么想法吗?

最佳答案

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

因此,在 Controller 中,向模型映射添加一个变量

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>

那么您不需要在 Controller 中添加枚举值。这是因为 spring-form:options-Tag 的一个不为人所知的功能。在 items 值的 tld 中,您可以读取:

... This attribute (items) is required unless the containing select's property for data binding is an Enum, in which case the enum's values are used.

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();
}
}

关于java - 为什么在 JSTL 中使用此枚举作为选项时会出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12730658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com