4

我正在尝试创建一个表单,其中包含一个映射到扩展 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:标签“radio”,字段“list”,名称“clientStatus.status”:请求的列表键“clientStatus.status”无法解析为集合/数组/映射/枚举/迭代器类型. 示例:人或人。{name}

关于问题可能是什么的任何想法?

编辑: 我认为问题在于 ClientStatus 为空。由于我只是实例化了一个 new Customer() 它的字段为空。这很糟糕,因为它需要我在程序的两个部分中对重复信息进行编码。我可以在视图中做这样的事情:

  <s:radio name="clientStatus.status"
       list="#{'NEW_CLIENT':'New Client',
               'EXISTING_CLIENT':'Existing Client',
               'RENEWAL':'Renewal'}"/>

或者,在控制器中,我必须显式实例化我的视图需要的 Customer 字段。这也使我编写一个可以处理各种 JAXB 对象的通用操作的希望破灭了,只需实例化给定的 JAXB 类并通过 getModel() 使其可用。

有人对如何从这种不幸的情况中恢复过来有任何想法吗?

编辑 2:将第一个表单修复为我期望的工作。

4

1 回答 1

1

修订答案

当错误消息指出:

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

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

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

只需在您的操作中添加一个 getter,该操作getClientStatuses将返回所有值的数组(或集合)。

原始答案

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

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

我通常在我的操作中公开枚举值。例如,getClientStatuses

于 2011-03-02T22:44:49.607 回答