【问题标题】:IllegalArgumentException when adding h:commandButton with f:param to h:dataTable将带有 f:param 的 h:commandButton 添加到 h:dataTable 时出现 IllegalArgumentException
【发布时间】:2011-06-10 14:44:18
【问题描述】:

目前我正在使用数据表来显示数据库中的一些项目。工作正常。

<h:dataTable border="1" value="#{overviewBean.loadContent }" var="item" first="0" >
    <h:column id="column1">
        <f:facet name="header">
            <h:outputText value="#{messages.overviewSubscriptionID }"></h:outputText>
        </f:facet>
        <h:outputText value="#{item.subscriptionID }"></h:outputText>
    </h:column>
    <h:column id="column2">
        <f:facet name="header">
            <h:outputText value="#{messages.overviewCourseID}"></h:outputText>
        </f:facet>
        <h:outputText value="#{item.courseID }"></h:outputText>
    </h:column>
    ...
    <h:column id="column13">
        <f:facet name="header">
            <h:outputText value="#{messages.overviewDeleteItem }"></h:outputText>
        </f:facet>
        <h:commandButton action="#{overviewBean.delete}" value="X">
            <f:param name="delete" value="#{item.courseID}"></f:param>
        </h:commandButton>
    </h:column>
</h:dataTable>

只要现在有参数标记,页面就不会加载。这是抛出的异常:

/overview.jsp(15,1) '#{overviewBean.loadContent }' java.lang.IllegalArgumentException
Caused by:
java.lang.IllegalArgumentException - java.lang.IllegalArgumentException


编辑: 由于请求,我添加了整个堆栈跟踪(如生成的页面上所示):
org.apache.jasper.el.JspELException: /overview.jsp(15,1) '#{overviewBean.loadContent }' java.lang.IllegalArgumentException
        at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:107)
        at javax.faces.component.UIData.getValue(UIData.java:1142)
        at javax.faces.component.UIData.createDataModel(UIData.java:1082)
        at javax.faces.component.UIData.getDataModel(UIData.java:1056)
        at javax.faces.component.UIData.getRowCount(UIData.java:449)
        at org.apache.myfaces.shared_impl.renderkit.html.HtmlTableRendererBase.encodeInnerHtml(HtmlTableRendererBase.java:234)
        at org.apache.myfaces.shared_impl.renderkit.html.HtmlTableRendererBase.encodeChildren(HtmlTableRendererBase.java:143)
        at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:627)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:250)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:257)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:257)
        at org.apache.myfaces.application.jsp.JspViewHandlerImpl.actuallyRenderView(JspViewHandlerImpl.java:427)
        at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:383)
        at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
        at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:140)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:187)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:662)
    Caused by: javax.faces.el.EvaluationException: java.lang.IllegalArgumentException
        at org.apache.myfaces.el.VariableResolverImpl.resolveVariable(VariableResolverImpl.java:80)
        at org.apache.myfaces.el.convert.VariableResolverToELResolver.getValue(VariableResolverToELResolver.java:95)
        at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
        at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:142)
        at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:68)
        at org.apache.el.parser.AstValue.getValue(AstValue.java:112)
        at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
        at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)
        ... 27 more
    Caused by: javax.el.ELException: java.lang.IllegalArgumentException
        at javax.el.BeanELResolver.setValue(BeanELResolver.java:116)
        at javax.el.CompositeELResolver.setValue(CompositeELResolver.java:69)
        at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.setValue(FacesCompositeELResolver.java:182)
        at org.apache.myfaces.config.ManagedBeanBuilder.initializeProperties(ManagedBeanBuilder.java:268)
        at org.apache.myfaces.config.ManagedBeanBuilder.buildManagedBean(ManagedBeanBuilder.java:92)
        at org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.createManagedBean(ManagedBeanResolver.java:198)
        at org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.getValue(ManagedBeanResolver.java:164)
        at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
        at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:142)
        at org.apache.myfaces.el.VariableResolverImpl.resolveVariable(VariableResolverImpl.java:65)
        ... 34 more
    Caused by: java.lang.IllegalArgumentException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at javax.el.BeanELResolver.setValue(BeanELResolver.java:108)
        ... 43 more


编辑 2: 这是实际生成的页面的链接:index_jsp.html

有什么想法吗? bean 已注册并且正常工作。方法 delete 也存在。 (列 id 也是正确的)

【问题讨论】:

  • 与问题无关:这不适用于 JSF 1.x。而是使用DataModel#getRowData() 或f:setPropertyActionListener。另请参阅this answer。
  • 请编辑您的问题以修复语法错误(这可能导致红鲱鱼)并发布整个堆栈跟踪。然后我们可以发布一个非常合适的答案。
  • 哇...多么不合逻辑的概念。这就是为什么这些参数标签是用于的,对吧?因为如果整个按钮都在数据表之外,那么东西会正确传输参数... :S 将尝试使用 DataModel,谢谢!你为什么不添加 this 作为回复?
  • 因为这不会引发IllegalArgumentException。请编辑您的问题以包含整个堆栈跟踪。这很可能是由完全不同的东西引起的。至于不合逻辑,f:param原本是为了给h:outputLink或h:commandLink的URL增加一个请求参数。这在 JSF 2.0 中已“修复”,也可以在 h:commandButton 中工作,因为存在许多“不合逻辑”的投诉 :)
  • 谢谢。当您只添加单行 &lt;f:param name="delete" value="#{item.courseID}"&gt;&lt;/f:param&gt; 然后打开页面时,您真的得到这个吗?换句话说,当您删除这一行时它显示正常?堆栈跟踪根本不建议这样做。如果它实际上在您单击命令按钮时被抛出(并且 EL 中的空白确实不是罪魁祸首),那会更有意义。

标签: java jsf tomcat datatable myfaces


【解决方案1】:

根据堆栈跟踪,您正在使用 MyFaces。这可能是 MyFaces 特有的,我在 Mojarra 上从未见过,我已经使用了多年。

至少,在h:commandButton 中使用f:param 无论如何都不会在JSF 1.x 上工作。它仅适用于h:commandLink。另一方面,您应该将数据表的值包装在 DataModel 中,以便您可以获得按下按钮的行。或者,如果您使用的是 JSF 1.2,您也可以使用 f:setPropertyActionListener。您可以在this answer 中找到示例。

【讨论】:

  • 发现其他东西:不适用于h:commandLink,这让我再次尝试删除f:param-标签。还是不行。仅当我从 faces-config.xml 中删除托管属性时,它才会再次显示该表。
  • 更新:设法在h:commandLink 中显示带有参数的链接,该bean 出现了某种错误。尽管“#{item.courseID}”的计算结果为 int,但我无法拥有 int 类型的托管属性。这导致了之前看到的行为。现在的问题似乎是参数未传递,因另一个异常而中止。我应该更改问题还是打开一个新问题?
  • 哪个例外?您能否确保在表单提交期间提供与初始显示期间相同的数据模型(数据表值背后的对象)?
  • 得回来看看。这是一个以request 为范围的托管bean,这应该可以工作,因为所有值都已传递,对吧?这里的例外是:“错误调用 id 为 j_id_jsp_1372441331_1:j_id_jsp_1372441331_3:8:j_id_jsp_1372441331_42 的组件的操作方法的原因:java.lang.NumberFormatException - null”
  • OK,数据模型没有被保留。归根结底,您需要确保#{overviewBean.loadContent} 在表单提交请求期间返回 same 值。这个有详细回答here。
猜你喜欢
  • 1970-01-01
  • 2012-01-10
  • 2011-04-26
  • 2015-08-07
  • 2016-08-02
  • 2016-12-31
  • 1970-01-01
  • 2016-04-18
相关资源
最近更新 更多