Wicket 使用HeaderResponseContainer:请求周期中不存在FilteringHeaderResponse
我正在尝试在wicket应用程序中添加自定义的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
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);
}
}