1

我正在开发一个 SpringMVC 3 和 Roo 项目。现在有一个网络层死胡同。基本上这是一个类型转换问题,让我发疯

我尝试在迭代表行列表时传递记录计数器(这里是 SystemSettings 表,然后每一行都是系统设置)。在 jspx 文件中,我进行了以下循环:

<form:form action="${form_url}" method="post" modelAttribute="formSettings">
        <c:forEach items="${settings}" var="item" varStatus="status">
            <c:set value="${item.actionType}" var="type"/>
            <c:set value="${item.name}" var="name"/>
            <c:set value="${item.setting}" var="value"/>
            <!--  -->
            <field:complex field="setting" id="l_com_transoftinc_vlm_carrierweb_domain_systemsetting_${name}" object="${item}" setting="${value}" type="${type}" cnt="${status.count-1}" formBacking="formSettings" z="user-managed"/>
        </c:forEach>

这样状态计数就可以将计数器值传递给“complex.tagx”。这里简化如下:

<jsp:directive.attribute name="cnt" type="java.lang.Integer" required="false" rtexprvalue="true" description="counter variable" /> 
<c:choose>
      <c:when test="${fn:toLowerCase(type) eq 'checkbox'}">
        <input type="checkbox" name="${formBacking[cnt].field}" value="TRUE" checked="${fn:toLowerCase(setting) eq 'true' ? 'checked' : ''}"/>
      </c:when>
      <c:when test="${fn:toLowerCase(type) eq 'inputbox'}">
        <input type="input" name="${formBacking[cnt].field}" value="${setting}"/>
      </c:when>
    </c:choose>

我没有把所有的属性都放在这里以使代码部分过于冗长。但是我得到一个非常讨厌的异常告诉我计数器(当然在第一次循环中返回 0)不是字符串类型?我认为JSTL可以自动转换它。但是,我知道我使用三个变量来组成组件名称可能不是一个好主意,但是我不明白这个异常,在这里,请帮助,非常感谢!

2012 年 5 月 14 日下午 6:39:59 org.apache.catalina.core.StandardWrapperValve 调用严重:Servlet.service() 用于 servlet [OptiVLM-CarrierWeb] 在上下文中与路径 [/OptiVLM-CarrierWeb] 引发异常 [请求处理失败; 嵌套异常是 org.apache.tiles.impl.CannotRenderException: ServletException 包括路径'/WEB-INF/layouts/default.jspx'。] 根本原因 javax.el.PropertyNotFoundException: 在类型 java.lang 上找不到属性'0' .String at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:237) at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:214) at javax.el.BeanELResolver.property(BeanELResolver.java: 325) 在 javax.el.BeanELResolver.getValue(BeanELResolver.java:85) 在 javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)

4

1 回答 1

2

此异常表明它${formBacking}实际上a java.lang.String,而不是数组或 a List,通过大括号表示法的索引访问将在其上起作用。

实际上,您将其指定为标签上的普通字符串:

<field:complex ... formBacking="formSettings" />

可能你的意思是它是一个 EL 表达式:

<field:complex ... formBacking="${formSettings}" />

您只需要确保它确实是一个数组或一个List.

于 2012-05-15T03:28:16.000 回答