1

现在已经分叉到githubwicket-rest项目不适用于 wicket-1.5。

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

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

4

1 回答 1

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

就是这样,您现在可以再次享受优雅的 wicket-rest api,这次使用的是 wicket-1.5。

我已经对此进行了测试并使用了它。

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

于 2012-08-27T07:52:30.523 回答