【问题标题】:Property '0' not found on type java.lang.String在类型 java.lang.String 上找不到属性“0”
【发布时间】:2012-05-22 11:00:03
【问题描述】:

我正在开发一个 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 [OptiVLM-CarrierWeb] 的 Servlet.service() 在路径 [/OptiVLM-CarrierWeb] 的上下文中抛出异常 [请求处理失败;嵌套异常是 org.apache.tiles.impl.CannotRenderException: ServletException include path '/WEB-INF/layouts/default.jspx'.] 根本原因 javax.el.PropertyNotFoundException:在类型 java.lang.String 上找不到属性“0” 在 javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:237) 在 javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:214) 在 javax.el.BeanELResolver.property(BeanELResolver.java:325) 在 javax.el.BeanELResolver.getValue(BeanELResolver.java:85) 在 javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)

【问题讨论】:

  • 我的解释是,异常告诉您您正在尝试访问字符串上名为 0 的属性,而不是 0 不是字符串。 formBacking 属性是否需要是 EL 表达式而不仅仅是单词“formSettings”?
  • 您好 Dave 和 CaptionAwesomePants,对于迟到的反馈,我们深表歉意。是的,实际上我应该使用 name="${formBacking}[${cnt}].id" 而不是 name="${formBacking[cnt].field}" 因为 formBacking 应该是 String 以外的变量。方括号“[]”不应该是变量的一部分。

标签: spring jsp spring-mvc tags jsp-tags


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢 BalusC 的快速反馈,很荣幸得到您的回复:D 实际上 formSettings 是一个类的实例,它只包含系统设置列表作为成员变量。谢谢。
猜你喜欢
  • 2016-09-16
  • 2016-01-10
  • 2019-11-05
  • 2012-06-06
  • 2015-05-12
  • 2014-02-17
  • 2016-08-17
  • 2020-11-11
相关资源
最近更新 更多