- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们在使用 Wicket 6(即版本 6.22.0)时遇到了问题。看起来这就是这里修复的内容:https://issues.apache.org/jira/browse/WICKET-5068简而言之:页面过期后,Wicket 尝试通过调用以页面类和 PageParameters
作为参数的构造函数来重建它,但 PageParameters
(错误地)为空,即使一些参数随请求一起发送。
After Wicket session timeout - pageParameters are null似乎与同一个问题有关。
WICKET-5068 已修复 Wicket 7,但我们有 Wicket 6,我们需要对其进行修复。
以下是对我们的发现和一些问题的详细解释。
发生的情况是这样的:
用户返回到初始浏览器选项卡并单击链接。这是链接的代码:
AjaxLink<Void> link = new AjaxLink<Void>("link") {
@Override
public void onClick(AjaxRequestTarget target) {
showWindow(dataModel, window, target);
}
};
add(link);
当 BookmarkableMapper
根据请求构建 IRequestHandler
时,会调用以下方法 (AbstractBookmarkableMapper:294):
protected PageParameters getPageParametersForListener(PageInfo pageInfo, PageParameters pageParameters)
{
if (pageInfo.getPageId() != null)
{
// WICKET-4594 - ignore the parsed parameters for stateful pages
return null;
}
return pageParameters;
}
因此,根据请求构建的 ListenerInterfaceRequestHandler
的 PageParameters
为 null
。
Wicket 开始处理点击。它尝试恢复被单击的链接所属的页面,这是通过以下方法完成的(PageProvider,从第 252 行开始):
private void resolvePageInstance(Integer pageId, Class<? extends IRequestablePage> pageClass,
PageParameters pageParameters, Integer renderCount)
{
IRequestablePage page = null;
boolean freshCreated = false;
if (pageId != null)
{
page = getStoredPage(pageId);
}
if (page == null)
{
if (pageClass != null)
{
page = getPageSource().newPageInstance(pageClass, pageParameters);
freshCreated = true;
}
}
if (page != null && !freshCreated)
{
if (renderCount != null && page.getRenderCount() != renderCount)
{
throw new StalePageException(page);
}
}
pageInstanceIsFresh = freshCreated;
pageInstance = page;
}
当页面从页面存储中逐出时,以下语句的条件成立:
if (page == null)
因此它尝试从类和页面参数创建页面实例:
page = getPageSource().newPageInstance(pageClass, pageParameters);
但是 pageParameters
在这里是 null
(因为第 5 项中的 getPageParametersForListener()
)。因此页面构造函数得到空的 PageParameters
并失败,因为它需要一些 id。
以下是从页面构造函数中的 PageParameters
中提取 id 的代码:
pageParameters.get("id").toLong()
这是生成的异常(仅显示顶行,因为其余行不相关):
org.apache.wicket.util.string.StringValueConversionException: Unable to convert 'null' to a long value
at org.apache.wicket.util.string.StringValue.toLong(StringValue.java:664)
因此,在我们的例子中,getPageParametersForListener()
方法破坏了恢复过期页面处理的可能性。
为了解决这个问题,我们用自定义实现替换了 BookmarkableMapper
:
public class BookmarkableMapperThatSavesPageParametersForListener extends BookmarkableMapper {
@Override
protected PageParameters getPageParametersForListener(PageInfo pageInfo, PageParameters pageParameters) {
return pageParameters;
}
}
我们在WebApplication#init()
方法中挂载:
mount(new BookmarkableMapperThatSavesPageParametersForListener());
它似乎解决了我们面临的问题:链接点击不会触发处理程序(onClick()
方法),但至少页面不会爆炸,只是自行刷新。
问题是:
最佳答案
这是 Wicket 6.x 的限制,已在 7.x 中实现。6.x 没有进行此更改,因为我们不确定它是否不会默默地破坏某人的应用程序。IIRC 如果升级期间需要,可以重写 7.x 中的方法以恢复到旧的行为。AFAIK 没有人提示 7.x 中的这一变化,所以我想将其向后移植到 6.x (6.27.0) 是可以的,但是 Wicket 的活跃开发人员不再使用 6.x,而且有人这样做的机会是相当低。建议您升级到7.x。它很稳定,有许多新功能和错误修复。在那之前,我猜您的选择是使用此请求映射器的自定义版本。
关于java - Wicket 口 6 : empty PageParameters when recreating a page after expiration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42751254/
过去,我为我的表单构建了如下标签: : 我还需要使用wicket:label吗?标签?我没有使用 wicket:label在 wicket 7 中,它似乎工作正常。我可能不理解使用 wicket:la
是否可以为 MarkupContainer 生成标记?动态地,即不为其存储 HTML 文件? 我考虑将标记作为纯字符串从数据库中读取,以提供类似 CMS 的功能。 最佳答案 有趣的问题,我不确定这是否
是否有适用于 Wicket 1.5 的有效、支持和维护的脚手架解决方案?我知道 Wicketopia 位于两个不同地点 sourceforge和 github但这仍然针对 wicket 1.4,带来了
我想了解一些关于 wicket 支持泛型模型的信息。我了解了模型、 Prop 模型和 Prop 复合模型。 但是 Model 类呢?如果我这样做会发生什么: Label label = new Lab
如何在 Wicket 中实现多选下拉。我能够使用 bootstrap 创建多选下拉 View ,但我无法获得如何将所选选项与下拉组件的 IModel 相关联? Wicket 有没有可能?我不想使用 L
我正在使用 wicket 1.4.9 并实现了 spring + wicket auth-role 并根据页面上的角色使用@AuthorizeInstantiation。我有多个自定义角色。 我已经按
如何在 Wicket 1.5 中执行以下操作? page.getRequestCycle().setRequestTarget(new RedirectRequestTarget("http://ww
我想用密码保护 Wicket 中的网页,以便用户只有在他/她登录后才能访问它。 我还希望该页面显示登录页面,然后在登录用户试图访问的原始页面后。 这是如何用 wicket 完成的?我已经创建了一个登录
我使用的是 wicket 1.5,但在 getClientInfo() 方法中看不到 (WebRequest)RequestCycle.get().getRequest() 我在另一个地方看到了这段代
我刚刚尝试了 Apache Wicket“Hello, world”应用程序,我注意到在呈现的 HTML 输出中,Wicket 暴露了它的内部属性。 这是呈现的 HTML 在浏览器的“查看源代码”中的
我找不到像 wicket:include 之类的 wicket 标签?谁能建议我什么?我想在 html 文件中包含/注入(inject)原始源代码?如果没有这样的实用程序,有什么建议来开发它吗? 更新
在页面中查找特定(已知 wicket id)Wicket 组件的方法是什么? 最佳答案 您的选择是: get()搜索一个组件的方法 特定路径上的组件。 安 iterator()在拥有他所有 child
我正在为 wicket 页面编写测试。我的页面上有三个下拉菜单。根据从下拉列表中选择的值,面板会被渲染(面板包含一个数据表)。 如何更改 wicket 测试中下拉菜单的值,以便我可以针对所选值的不同组
在我的 wicket 应用程序中,有一些页面供用户使用,具体取决于他们的角色和不同的标准。在我的数据库中,我存储了用作该用户背景的图像路径。每个用户都有一个独特的页面。我知道我可以添加读取图像,如果我
如何在 Wicket 中定义我自己的反馈消息? 例如:如果我提供了一个错误的用户名,我想得到一个错误信息,如“用户名不正确,请尝试再次登录”。而不是使用默认的错误消息。 一个例子会是什么样的? 最佳答
假设我想要 3 个不同的 *.html 用于 WebPage。 F.e. page_small.html、page_tablet.html、page_desktop.html。我如何解析 screen
我无法确定 Wicket 应用程序中 RuntimeException 的原因。我设置了许多断点,但是当我提交表单时,只有在加载表单时,没有一个断点被触发。这是堆栈: WicketMessage: N
我刚刚编写了我的第一个 Wicket 组件 :) 它包含一个 ListView 和一些 Radio 输入字段。现在我想对所选值是否进入模型进行单元测试。 由于 WicketTester.newForm
我的类属性有两个 CSS 类值。 HTML 开头是这样的: 我想动态地把它改成这样: 目前我正在这样做: component.add(new SimpleAttributeModifier("cl
我有一个使用 PropertyModel 的文本字段,如下所示: TextField ageField = new TextField("age", new
我是一名优秀的程序员,十分优秀!