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)

我可以清楚地看到有问题的组件被添加到我的 AbstractParentPanel 的标记中,我的 ChildPanel 扩展了它。奇怪的是,如果我将 AbstractParentPanel 设为非抽象类,我可以毫无问题地添加该面板。

为什么我会收到此错误?

注意:我已经找到了这个问题的答案。我将它添加到 SO 以帮助其他人,因为我浪费了比我应该花更多的时间来进行如此简单的检查。如果您被此消息所困扰并且此答案对您有所帮助,请考虑投票支持此 JIRA 票

4

3 回答 3

6

总是从显而易见的开始,并确保wicket:id(s)在你的标记中定义。如果您在标记中看到添加的 ID,那么您很可能遇到以下情况:

  • 您正在尝试呈现作为另一个组件的子组件的组件。这意味着您尝试呈现作为另一个页面或面板的子类的页面或面板。
    • 例如,在您尝试调用的页面内add(new ChildPanel("myChildPanel"));
  • 您正在扩展的组件已经定义并添加了带有自己标记的组件
    • 例如,在AbstractParentPanel你呼唤内add(new Label("myCommonLabel"));
  • 子组件中的标记未能包含一些必需的 Wicket XHTML
    • 例如ChildPanel.html,您忘记添加<wicket:extend>标签,甚至忘记添加标签<wicket:panel>,或者您让它们不包含有问题的组件。
于 2012-06-19T21:30:39.277 回答
4

确保您设置的是 Wicket 组件wicket:id而不是id! 这个总是让我着迷。

于 2013-03-13T14:41:00.760 回答
4

另一种可能性是您的页面没有任何标记。如果您的 java 类的名称与您的 html 的名称不匹配,这可能会意外发生。我最近在这里遇到了区分大小写的情况。

于 2015-01-29T08:49:12.873 回答