现在已经分叉到github的wicket-rest项目不适用于 wicket-1.5。
此问题已在wicket 邮件列表中提出,但仍未解决。我尝试了邮件列表中给出的建议,但问题仍然存在。没有调用“onBeforeRender”方法,因此有效地绕过了wicket-rest 预处理。
当无状态提示设置为 true 时,可能不会调用“onBeforeRender”?
现在已经分叉到github的wicket-rest项目不适用于 wicket-1.5。
此问题已在wicket 邮件列表中提出,但仍未解决。我尝试了邮件列表中给出的建议,但问题仍然存在。没有调用“onBeforeRender”方法,因此有效地绕过了wicket-rest 预处理。
当无状态提示设置为 true 时,可能不会调用“onBeforeRender”?
经过一番研究,我设法解决了这个问题,并考虑与社区分享。
由于 wicket-1.5 中的 api 更改,需要在 wicket-rest-api 类中进行以下更改:
AbstractWebServicePage(或者如果你已经派生了它,它是等效的)现在应该实现 IMarkupResourceStreamProvider。实现可以是这样的:(取自邮件列表)
@Override
public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass)
{
return new StringResourceStream("");
}
“hasAssociatedMarkup”现在已弃用,可以从 AbstractWebServicePage 中删除。
将 AbstractWebServicePage 中重写的“onBeforeRender”中定义的代码移动到名为“onBeforeRenderPage”的方法中。请注意,此方法不是 wicket api 的一部分,而是由我们创建的,因为在这种情况下不会调用“onBeforeRender”。
protected void onBeforeRenderPage()
{
HttpServletRequest servletRequest = (HttpServletRequest) getRequest().getContainerRequest();
HttpServletResponse servletResponse = (HttpServletResponse) getResponse().getContainerResponse();
String method = servletRequest.getMethod();
logger.debug("Received a {} request from {}:{}", new Object[]{method, servletRequest.getRemoteAddr(),
servletRequest.getRemotePort()});
if (POST.equals(method)) {
try {
setModelFromBody(getRequestBody());
} catch (Exception e) {
//swallow this exception
}
doPost(getPageParameters(), servletRequest, servletResponse);
} else if (GET.equals(method)) {
doGet(getPageParameters(), servletRequest, servletResponse);
}
}
在相应的子类(JSon、Xml 等)中,将方法“onRender()”替换为“renderPage()”,并在执行任何其他操作之前调用我们自定义编写的超级方法“onBeforeRenderPage”。它可能看起来像这样:
@Override
public final void renderPage()
{
super.onBeforeRenderPage();
getResponse().write(getJson());
}
就是这样,您现在可以再次享受优雅的 wicket-rest api,这次使用的是 wicket-1.5。
我已经对此进行了测试并使用了它。
如果你有更好的意见,请分享。