Wicket 使用HeaderResponseContainer:请求周期中不存在FilteringHeaderResponse

Wicket 使用HeaderResponseContainer:请求周期中不存在FilteringHeaderResponse,wicket,Wicket,我正在尝试在wicket应用程序中添加自定义的HeaderResponseContainer。这看起来很简单(请参见贡献的定位),但是当我添加这些行并运行应用程序时,我得到了一个IllegalStateException: java.lang.IllegalStateException: No FilteringHeaderResponse is present in the request cycle. This may mean that you have not decorated th

我正在尝试在wicket应用程序中添加自定义的
HeaderResponseContainer
。这看起来很简单(请参见贡献的定位),但是当我添加这些行并运行应用程序时,我得到了一个
IllegalStateException

java.lang.IllegalStateException: No FilteringHeaderResponse is present in the request cycle.  This may mean that you have not decorated the header response with a FilteringHeaderResponse.  Simply calling the FilteringHeaderResponse constructor sets itself on the request cycle
     at org.apache.wicket.markup.head.filter.FilteringHeaderResponse.get(FilteringHeaderResponse.java:165)
     at org.apache.wicket.markup.head.filter.HeaderResponseContainer.onComponentTagBody(HeaderResponseContainer.java:64)
     at org.apache.wicket.markup.html.panel.DefaultMarkupSourcingStrategy.onComponentTagBody(DefaultMarkupSourcingStrategy.java:71)
     ...
是的,我已经看到了关于
FilteringHeaderResponse
的说明。但是我不确定应该在哪里调用构造函数。在调用
response.render
之前,我已经尝试将其添加到
renderHead
中,但仍然得到相同的异常:

public void renderHead(IHeaderResponse response) {
        super.renderHead(response);
        FilteringHeaderResponse resp = new FilteringHeaderResponse(response);
        resp.render(new FilteredHeaderItem(..., "myKey"));
}

您可以创建一个decorator,将响应包装在
过滤器headerResponse
中:

public final class FilteringHeaderResponseDecorator implements IHeaderResponseDecorator {

    @Override
    public IHeaderResponse decorate(IHeaderResponse response) {
        return new FilteringHeaderResponse(response);
    }
}
并在应用程序初始化期间设置它:

Override
public void init() {
    super.init();

    setHeaderResponseDecorator(new FilteringHeaderResponseDecorator());
}

您可以创建一个decorator,将响应包装在
过滤器headerResponse
中:

public final class FilteringHeaderResponseDecorator implements IHeaderResponseDecorator {

    @Override
    public IHeaderResponse decorate(IHeaderResponse response) {
        return new FilteringHeaderResponse(response);
    }
}
并在应用程序初始化期间设置它:

Override
public void init() {
    super.init();

    setHeaderResponseDecorator(new FilteringHeaderResponseDecorator());
}

我刚刚遇到了同样的问题,发现Wicket In-Action教程遗漏了关于在主Wicket应用程序init中设置自定义IHeaderResponseDecorator的部分。Wicket指南有一个更全面的例子:

在wicket应用程序中需要类似的内容:

 @Override
public void init()
{
   setHeaderResponseDecorator(new JavaScriptToBucketResponseDecorator("myKey"));
}

 /**
 * Decorates an original IHeaderResponse and renders all javascript items
 * (JavaScriptHeaderItem), to a specific container in the page.
 */
static class JavaScriptToBucketResponseDecorator implements IHeaderResponseDecorator 
{

    private String bucketName;

    public JavaScriptToBucketResponseDecorator(String bucketName) {
        this.bucketName = bucketName;
    }

    @Override
    public IHeaderResponse decorate(IHeaderResponse response) {
        return new JavaScriptFilteredIntoFooterHeaderResponse(response, bucketName);
    }

}

我刚刚遇到了同样的问题,发现Wicket In-Action教程遗漏了关于在主Wicket应用程序init中设置自定义IHeaderResponseDecorator的部分。Wicket指南有一个更全面的例子:

在wicket应用程序中需要类似的内容:

 @Override
public void init()
{
   setHeaderResponseDecorator(new JavaScriptToBucketResponseDecorator("myKey"));
}

 /**
 * Decorates an original IHeaderResponse and renders all javascript items
 * (JavaScriptHeaderItem), to a specific container in the page.
 */
static class JavaScriptToBucketResponseDecorator implements IHeaderResponseDecorator 
{

    private String bucketName;

    public JavaScriptToBucketResponseDecorator(String bucketName) {
        this.bucketName = bucketName;
    }

    @Override
    public IHeaderResponse decorate(IHeaderResponse response) {
        return new JavaScriptFilteredIntoFooterHeaderResponse(response, bucketName);
    }

}