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

Sne*_*kse 4 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)
Run Code Online (Sandbox Code Playgroud)

我可以清楚地看到有问题的组件被添加到我的ChildPanel扩展的AbstractParentPanel的标记中.奇怪的是,如果我将AbstractParentPanel设为非抽象类,我可以添加该面板而不会出现任何问题.

为什么我收到此错误?

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

Sne*_*kse 6

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

  • 您正在尝试呈现作为另一个Component的子项的Component.这意味着您尝试渲染作为另一个页面或面板的子类的Page或Panel.
    • 例如,在您尝试呼叫的页面中 add(new ChildPanel("myChildPanel"));
  • 您正在扩展的组件已使用它自己的标记定义并添加了组件
    • AbstractParentPanel你打电话的时候add(new Label("myCommonLabel"));
  • 子Component中的标记未能包含一些必需的Wicket XHTML
    • 例如,在内部ChildPanel.html,您忘记添加<wicket:extend>标签或甚至<wicket:panel>标签,或者您没有包含相关组件.

  • 确保字符串`wicket:id`也没有拼写错误.我花了半个小时一次追踪其他可能性,然后注意到我在标记中有'wicker:id`.:) (2认同)