我正在尝试创建一个包含单选按钮的表单,该按钮映射到扩展java.lang.Enum的类。
<s:form action="corp_low_save">
<s:textfield label="Corporate Client Name" name="name"/>
<s:radio list="clientStatus.status" name="clientStatus.status"/>
<s:textfield label="Primary Address Street" name="primaryAddress.street"/>
<s:submit />
</s:form>
Action实现了ModelDriven,并通过getModel()创建了以下对象的新实例:
public class com...Customer extends java.lang.Object{
protected java.lang.String name;
protected com...ClientStatus clientStatus;
protected com...Address primaryAddress;
public com...Customer();
public java.lang.String getName();
public void setName(java.lang.String);
public com...ClientStatus getClientStatus();
public void setClientStatus(com...ClientStatus);
public com...Address getPrimaryAddress();
public void setPrimaryAddress(com...Address);
}
以下是其他相关课程。它们都是由JAXB生成的:
public class com...ClientStatus extends java.lang.Object{
protected com...StatusString status;
protected javax.xml.datatype.XMLGregorianCalendar since;
protected java.lang.String business;
public com...ClientStatus();
public com...StatusString getStatus();
public void setStatus(com...StatusString);
public javax.xml.datatype.XMLGregorianCalendar getSince();
public void setSince(javax.xml.datatype.XMLGregorianCalendar);
public java.lang.String getBusiness();
public void setBusiness(java.lang.String);
}
public final class com...StatusString extends java.lang.Enum{
public static final com...StatusString NEW_CLIENT;
public static final com...StatusString EXISTING_CLIENT;
public static final com...StatusString RENEWAL;
public static com...StatusString[] values();
public static com...StatusString valueOf(java.lang.String);
public java.lang.String value();
public static com...StatusString fromValue(java.lang.String);
static {};
}
我收到了这个错误:
org.apache.jasper.JasperException:tag 'radio',字段'list',名字 'clientStatus.status':请求的 列表键'clientStatus.status'可以 不能解决为 收集/阵列/图/枚举/迭代 类型。例如:人或人。{name}
关于问题可能是什么的任何想法?
修改 我认为问题是ClientStatus为null。由于我只是实例化了一个新的Customer(),因此它的字段为空。这是一个无赖,因为它要求我在程序的两个部分中编码重复信息。我可以在视图中做这样的事情:
<s:radio name="clientStatus.status"
list="#{'NEW_CLIENT':'New Client',
'EXISTING_CLIENT':'Existing Client',
'RENEWAL':'Renewal'}"/>
或者,在控制器中,我必须显式实例化我的视图所需的Customer字段。这也破坏了我希望编写一个可以处理各种JAXB对象的通用操作,只需实例化给定的JAXB类并通过getModel()使其可用。
任何人都有任何想法如何从这种不幸的事态中恢复过来?
修改2:修正了我希望工作的第一个表单。
答案 0 :(得分:1)
修订答案
当错误消息指出:
无法解析为集合/数组/地图/ 枚举 /迭代器类型
这意味着java.util.Enumeration
,而不是枚举。
话虽如此,你仍然可以使用枚举,你只需要传递一个数组或你想要的值的集合。例如,ClientStatus.values()
,它返回一个数组。
只需在名为getClientStatuses
的动作中添加一个getter,它将返回所有值的数组(或集合)。
原始答案
list
属性需要获取所有枚举值。在您的第一个示例中,它看起来不会发生。相反,您提供的是clientStatus
。这不是一个单独的枚举值吗?
在修改过的示例中,您为list
属性提供了一个地图,因此它正在运行。
我经常在动作中公开枚举值。例如,getClientStatuses
。