为什么我得到“下面的组件无法呈现”?

时间:2012-06-19 21:30:39

标签: wicket wicket-1.5

当我将ChildPanel添加到页面时,出现错误,指出:

org.apache.wicket.WicketRuntimeException: 
The component(s) below failed to render.
A common problem is that you have added a component in code 
but forgot to reference it in the markup 
(thus the component will never be rendered).

1. [Form [Component id = myForm]]
2. [DropDownChoice [Component id = referenceType]]
3. [TextField [Component id = referenceNumber]]
4. [CheckBox [Component id = referenceReqChk]]
5. [ [Component id = saveRefNumButton]]
6. [ [Component id = cancelRefNumButton]]

    at org.apache.wicket.Page.checkRendering(Page.java:693)
    at org.apache.wicket.Page.onAfterRender(Page.java:849)
    at org.apache.wicket.markup.html.WebPage.onAfterRender(WebPage.java:213)
    at org.apache.wicket.Component.afterRender(Component.java:950)
    at org.apache.wicket.Component.render(Component.java:2298)
    at org.apache.wicket.Page.renderPage(Page.java:1041)
    at org.apache.wicket.request.handler.render.
           WebPageRenderer.renderPage(WebPageRenderer.java:105)

我可以清楚地看到有问题的组件被添加到我的ChildPanel扩展的AbstractParentPanel的标记中。奇怪的是,如果我使AbstractParentPanel成为一个非抽象类,我就可以添加该面板而没有任何问题。

为什么我收到此错误?

注意:我已经找到了这个问题的答案。我将它添加到SO中以帮助其他人,因为我浪费的时间超过了我应该进行如此简单的检查。如果您被此消息灼伤并且此答案对您有帮助,请考虑投票this JIRA ticket

3 个答案:

答案 0 :(得分:6)

始终从明显开始,并确保在标记中定义wicket:id(s)。如果您在标记中看到添加的ID,那么您可能会遇到以下情况:

  • 您正在尝试渲染另一个Component的子组件。这意味着您尝试渲染作为另一个页面或面板的子类的Page或Panel。
    • e.g。在页面中,您尝试拨打add(new ChildPanel("myChildPanel"));
  • 您正在扩展的组件已定义并添加了具有自己标记的组件
    • e.g。在AbstractParentPanel add(new Label("myCommonLabel"));内,您可以拨打ChildPanel.html
  • 子Component中的标记未能包含一些必需的Wicket XHTML
    • e.g。在<wicket:extend>内,您忘记添加<wicket:panel>标记或甚至{{1}}个标记,或者您没有包含相关组件。

答案 1 :(得分:4)

另一种可能性是您的页面没有任何标记。如果您的java类的名称与您的html名称不匹配,则可能会发生这种情况。最近我在这里遇到了一个案例敏感的情况。

答案 2 :(得分:2)

确保您正在设置Wicket组件wicket:id而不是id!这个让我一直都在。