Wicket ComponentNotFoundException:组件已从页面中删除

Wicket ComponentNotFoundException: Component has been removed from page

我在每行中列出了 ajax link。此 link 管理自己的行删除过程。用 WebMarkupContainer 包裹的整个列表。 按link,调用下一个逻辑 1) 从数据库中删除的项目。 2)更新列表模型 3) target.add(wmc) - 将 WebMarkupContainer 添加到 ajax 以更新

因为列表有一个以上的元素,每个删除操作在渲染阶段崩溃。所以在刷新页面后我看到该操作已完成,但问题发生在那之后

  IKickListener onKickListener = new IKickListener() {
        @Override
        public void onKickListener(ListItem<Consultant> item, AjaxRequestTarget target) {

            Cons modelObject = item.getModelObject();
            mUserDAO.remove(modelObject.accountId, getId());

            updateListModel();
            target.add(mWmc);
            target.appendJavaScript("console.log("kicked")");
        }
    };

        mWmc = new WebMarkupContainer("wmc");
        mWmc.setOutputMarkupId(true);
        add(mWmc);
        ListView listView = new ConsListView("consList", new PropertyModel<List<? extends Cons>>(this, "consultants"), onKickListener);
        mWmc.add(listView);

并填充我的列表的方法

@Override
protected void populateItem(final ListItem<ConsPanel.Cons> item) {
    item.add(new IndicatingAjaxLink("actionKick") {

        private static final long serialVersionUID = 1L;

        @Override
        public void onClick(AjaxRequestTarget target) {
            mKickListener.onKickListener(item, target);
        }
    });
}

然后我收到下一个堆栈跟踪

org.apache.wicket.core.request.handler.ComponentNotFoundException: Component 'consPanelPlace:cons:wmc:consList:2:actionKick' has been removed from page.
    at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:177)
    at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:865)
    at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
    at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:265)
    at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:222)
    at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:293)
    at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:261)
    at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:203)
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:284)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

我使用 wicket 7.0.0-M5

更新 我发现,当我在列表中有超过 1 个项目时,ajax 回调仅附加到第一个。但是点击操作删除了除一个之外的所有项目。还 ajax link 调用项目计数次数。

我解决了这个问题。我在每个项目上都有相同的 ID,不是 wicket:id,而是通用 ID。所以 listener 已经附加到第一个,因为 wicket ajax 正在听它。然后它叫了几次。 问题出在标记中。

<span class="btn" wicket:id="actionKick" id="kick">Kick</span>
                                         ^^^^^^^^^---problem was here