加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:24:11 所属栏目:Java 来源:网络整理
导读:我正在尝试创建一个包含单选按钮的表单,该按钮映射到扩展 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
我正在尝试创建一个包含单选按钮的表单,该按钮映射到扩展 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’,field ‘list’,name
‘clientStatus.status’: The requested
list key ‘clientStatus.status’ could
not be resolved as a
collection/array/map/enumeration/iterator
type. Example: people or people.{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:修复了我希望工作的第一个表格.

解决方法

修订后的答案

当错误消息指出:

could not be resolved as a collection/array/map/enumeration/iterator type

它表示java.util.Enumeration,而不是枚举.

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

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

原始答案

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

在修改后的示例中,您为列表属性提供了一个映射,因此它正在运行.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读