0
votes

I am migrating an application from older version of wicket to wicket 8. Some pages are working ok (simple pages such as login). These pages does not use the extension mechanism. When I access to a page that has the mechanism it doesn't work. I don't know if this is a bug but I tried everything and couldn't find a solution. I am using wicket 8.0.0-M5 (i kwnow that is not a stable release). Anybody had the same problem? Here is my code:

WerklijstPageXXX.html

<html xmlns:wicket>
 <body>
    <wicket:extend>
        <div wicket:id="panelXXX"></div>
    </wicket:extend>
</body>

WerklijstPanelXXX.html

<wicket:head xmlns:wicket>
</wicket:head>

<wicket:panel xmlns:wicket>
    <div wicket:id="filter">
         <div wicket:id="label"></div>
    </div>
</wicket:panel>

WerklijstPageXXX.java

public class WerklijstPageXXX extends BasePage {

private WerklijstPanelXXX werklijstPanel;

public WerklijstPageXXX() {
    werklijstPanel = new WerklijstPanelXXX("panelXXX"){};
    add(werklijstPanel);
}

@Override
public Panel getContextPanel(String id)
{
    return werklijstPanel.getWerklijstFilterPanel();
}

WerklijstPanelXXX.java

public abstract class WerklijstPanelXXX extends Panel {
private static final Logger LOG = LoggerFactory
        .getLogger(WerklijstPanelXXX.class);

private Panel filterPanel;

public WerklijstPanelXXX(String id) {
    super(id);
    WebMarkupContainer upperPanel = new WebMarkupContainer("filter");
    filterPanel = new Panel("filterPanel") {

    };

    add(upperPanel);

    upperPanel.add(new Label("label"));


}

public Panel getWerklijstFilterPanel() {
    return filterPanel;
}

EDIT: BasePage.html (part of it)

<div id="body" class="body">
                <div id="aside" class="aside">
                    <div wicket:id="contextPanel"></div>
                </div>
                <div id="content" class="content">
                    <div class="padding">
                        <wicket:child></wicket:child>
                    </div>
                </div>
            </div>

BasePage.java

    @Override
protected void onInitialize() {
    super.onInitialize();
    add(getContextPanel("contextPanel"));
    addTabMenu();
    addMenu();
    addPatientBar();
}

Error:

Root cause:

org.apache.wicket.WicketRuntimeException: The component(s) below failed to render. Possible reasons could be that: 1) you have added a component in code but forgot to reference it in the markup (thus the component will never be rendered), 2) if your components were added in a parent container then make sure the markup for the child container includes them in .

  1. [WerklijstPanelXXX [Component id = panelXXX, page = nl.philips.raris.web.werklijst.WerklijstPageXXX, path = panelXXX, type = nl.philips.raris.web.werklijst.WerklijstPanelXXX, isVisible = true, isVersioned = true], children = [WebMarkupContainer [Component id = filter]]]
  2. [WebMarkupContainer [Component id = filter, page = nl.philips.raris.web.werklijst.WerklijstPageXXX, path = panelXXX:filter, type = org.apache.wicket.markup.html.WebMarkupContainer, isVisible = true, isVersioned = true], children = [Component id = label]]
  3. [Component id = label, page = nl.philips.raris.web.werklijst.WerklijstPageXXX, path = panelXXX:filter:label, type = org.apache.wicket.markup.html.basic.Label, isVisible = true, isVersioned = true]
  4. [Panel [Component id = filterPanel, page = nl.philips.raris.web.werklijst.WerklijstPageXXX, path = filterPanel, type = org.apache.wicket.markup.html.panel.Panel, isVisible = true, isVersioned = true]]

    at org.apache.wicket.Page.checkRendering(Page.java:662) at org.apache.wicket.Page.onAfterRender(Page.java:805) at org.apache.wicket.markup.html.WebPage.onAfterRender(WebPage.java:209) at org.apache.wicket.Component.afterRender(Component.java:919) at org.apache.wicket.Component.render(Component.java:2335) at org.apache.wicket.Page.renderPage(Page.java:987) at org.apache.wicket.request.handler.render.WebPageRenderer.renderPage(WebPageRenderer.java:124) at org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:236) at org.apache.wicket.core.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:175) at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:912) at org.apache.wicket.request.RequestHandlerExecutor.execute(RequestHandlerExecutor.java:65) at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:283) at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:253) at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:221) at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:262) at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:204) at org.apache.wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:137) at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669) at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387) at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:151) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)

1
What exactly do you mean by "doesn't work"? Does it just display the base page or do you get an exception? Also it would probably be good if you shared your code+html for BasePage. Without the correct <wicket:child> tags in the BasePage the <wicket:extend> tags will not work. - OH GOD SPIDERS
Sorry. I forgot add the error and BasePage stuff. - fselvatici

1 Answers

2
votes

The Java and HTML component trees should match.

Your HTML states: <div wicket:id="*contextPanel*"></div>, but your Java code returns a Panel with id filterPanel instead.

public WerklijstPageXXX() {
    werklijstPanel = new WerklijstPanelXXX("panelXXX"){};
    add(werklijstPanel);
}

@Override
public Panel getContextPanel(String id)  // HERE id is ignored
{
    return werklijstPanel.getWerklijstFilterPanel(); // This returns a panel with id `filterPanel`
}