WicketRuntimeException:在页面LogIn上找不到组件注销

时间:2014-03-14 10:16:14

标签: java wicket

登录提交按钮:

if(loginAllowed) 
{
  if (!continueToOriginalDestination())
  {
    setResponsePage(General.class);
  }
}

常规页面注销按钮:

getWicketWebSession().invalidateNow();
getRequestCycle().setRedirect(true);
setResponsePage(LogIn.class);

用户在会话中时效果很好。但是当会话到期并且用户点击“注销”时 - 我们在PageMap中保存“general?wicket:interface =:1:logout :: ILinkListener ::”,当用户登录时 - 我们得到例外:

wicket.RequestCycle | org.apache.wicket.WicketRuntimeException: 
component logout not  found on page LogIn[id = 1], 
listener interface = [RequestListenerInterface name=ILinkListener, 
method=public abstract void
org.apache.wicket.markup.html.link.ILinkListener.onLinkClicked()

但我仍然需要重定向用户,并且无法删除continueToOriginalDestination()。 你能给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

[删除原始答案]

我无法使用Wicket 6使用最小测试应用程序重现您的问题。也许您使用的是其他版本?

无论哪种方式,您需要做的是创建一个新的LogoutPage,它只是注销用户并在构造函数中重定向他。然后,将您的注销按钮更改为该页面的BookmarkablePageLink。该链接无法过期,因为它可以收藏。

使用注销页面而不是在链接处理程序中注销是更好的做法IMO,因为:

  1. 它始终有效(没有过期的页面)。
  2. 当您想要退出时,走RestartResponseAtInterceptPageException的路线似乎违反直觉。
  3. 您的退出代码在一个地方;您只需要链接到注销页面即可使用它。
  4. 像您一样添加注销链接到无状态页面将使其成为有状态。使用注销页面可以避免这种情况。