使用struts2将枚举映射到表单元素

时间:2011-03-02 21:23:51

标签: java struts2 jaxb model-driven

我正在尝试创建一个包含单选按钮的表单,该按钮映射到扩展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:修正了我希望工作的第一个表单。

1 个答案:

答案 0 :(得分:1)

修订答案

当错误消息指出:

  

无法解析为集合/数组/地图/ 枚举 /迭代器类型

这意味着java.util.Enumeration,而不是枚举。

话虽如此,你仍然可以使用枚举,你只需要传递一个数组或你想要的值的集合。例如,ClientStatus.values(),它返回一个数组。

只需在名为getClientStatuses的动作中添加一个getter,它将返回所有值的数组(或集合)。

原始答案

list属性需要获取所有枚举值。在您的第一个示例中,它看起来不会发生。相反,您提供的是clientStatus。这不是一个单独的枚举值吗?

在修改过的示例中,您为list属性提供了一个地图,因此它正在运行。

我经常在动作中公开枚举值。例如,getClientStatuses