wicket-rest不适用于wicket 1.5

时间:2012-08-27 07:52:31

标签: wicket wicket-1.5

现在已分叉到wicket-restgithub项目与wicket-1.5不兼容。

wicket mailing list中提出了这个问题,但仍未得到解决。我尝试了邮件列表中给出的建议,但问题仍然存在。不会调用“onBeforeRender”方法,因此有效地绕过了wicket-rest预处理。

当无状态提示设置为true时,可能不会调用“onBeforeRender”吗?

1 个答案:

答案 0 :(得分:1)

经过一番研究,我设法解决了这个问题,并考虑与社区分享这个问题。

由于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());
    }
    

就是这样,你现在准备再次享受优雅的检票口休息api,这次是wicket-1.5。

我测试了这个并使用它。

如果您有更好的意见,请分享。