java - Wicket 口 9 : usage of JavaScriptFilteredIntoFooterHeaderResponse seems to cause trouble with renderHead

标签 java spring-boot wicket renderer

我通过包含 wicket-spring-boot-starter 3.0.4 来使用 Wicket 9。

在我的演示项目中,需要将 JavaScript 放在 <body> 的末尾。 。所以我按照https://ci.apache.org/projects/wicket/guide/9.x/single.html#_put_javascript_inside_page_body中的解释进行操作

我还通过 Component#renderHead(IHeaderReponse) 的实现添加了资源(CSS 和 JS)在我的页面中。

在 Wicket 8 上一切都按预期工作(来自 wicket-spring-boot-starter 2.1.9)。

在 Wicket 9 中,为了让我的应用程序运行,我首先输入 webApplication.getCspSettings().blocking().disabled();WicketApplicationInitConfiguration#init(WebApplication) 。我的应用程序启动,但生成的页面不包含<head>部分,因此应用程序由于缺少资源而无法运行。

为了使<head>元素出现在我的页面中并包含所有引用,我注释掉了 <body> 中引用 JavaScript 渲染的所有代码。 。 但我的应用程序无法使用此“解决方法”。

我做错了什么吗?

@ApplicationInitExtension
public class DemoWicketInitializer implements WicketApplicationInitConfiguration {
    @Override
    public void init(WebApplication webApplication) {

        webApplication.getCspSettings().blocking().disabled();

        webApplication.getHeaderResponseDecorators().add(response -> new ResourceAggregator(
                new JavaScriptFilteredIntoFooterHeaderResponse(response, "scripts")));

        webApplication.getMarkupSettings().setDefaultMarkupEncoding("UTF-8");    
    }
}
@WicketHomePage
public class MyPage extends WebPage {

    @Override
    public void renderHead(IHeaderResponse response) {
        super.renderHead(response);

        response.render(JavaScriptHeaderItem.forUrl(
            "https://api.mapbox.com/mapbox-gl-js/v1.8.1/mapbox-gl.js"));
        response.render(JavaScriptHeaderItem.forUrl(
            "https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.9/mapbox-gl-draw.js"));

        // this piece of JS has to appear in <body>. ################################
        response.render(JavaScriptHeaderItem.forReference(new PackageResourceReference(getClass(),
                "js/demoMapbox.js")));

        response.render(CssHeaderItem.forUrl(
            "https://api.mapbox.com/mapbox-gl-js/v1.8.1/mapbox-gl.css"));
        response.render(CssHeaderItem.forUrl(
            "https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.9/mapbox-gl-draw.css"));
        }

    public MyPage(PageParameters parameters) {
            // some components

            add(new HeaderResponseContainer("scriptBlock", "scripts"));
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org" lang="de">
<head>
</head>
<body>
<h1>Wicket und Mapbox</h1>

<div id="ndsmap" style="width: 800px; height: 500px"></div>

<a href="#" wicket:id="sendPostDrawingAction">als POST</a><br>

<h4>Zeichnung als GeoJSON</h4>
<p wicket:id="drawingJson"></p>
<h4>Polygone WGS84</h4>
<p wicket:id="geoWGS84"></p>
<h4>Polygone UTM32N</h4>
<p wicket:id="geoUTM32N"></p>

<wicket:container wicket:id="scriptBlock"/>

</body>
</html>
public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoWicketMapboxApplication.class);
    }

}

最佳答案

看起来 CSP 机制正在干扰 JavaScriptFilteredIntoFooterHeaderResponse。我将在 JIRA 上打开一个有关此问题的问题。同时,作为解决方法,您可以使用 setHeaderResponseDecorator (已弃用)而不是 getHeaderResponseDecorators:

setHeaderResponseDecorator(response -> new ResourceAggregator(
            new JavaScriptFilteredIntoFooterHeaderResponse(response, "scripts")));

这应该能让您的应用正常运行。

更新

pointed out on jira这不是一个错误。由于现在我们已经使用 CSP 默认添加了一个 ResourceAggregator,要添加进一步的响应装饰器,我们应该执行以下操作:

getHeaderResponseDecorators().add(response -> 
 new JavaScriptFilteredIntoFooterHeaderResponse(response, "scripts"));

我们将相应更新 Wicket 9.x 的文档及其迁移指南。

关于java - Wicket 口 9 : usage of JavaScriptFilteredIntoFooterHeaderResponse seems to cause trouble with renderHead,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63158243/

相关文章:

java - 抵消单纯形噪声返回值

java - 从存储获取视频信息不起作用

java - 尝试处理 Spring Boot 应用程序中的异常时日志中出现 ErrorPageFilter 错误

java - hibernate @OneToOne(fetch = FetchType.LAZY) 不工作

java - SmartGWT 替代品

java - 错误 : "Class names are only accepted if annotation processing is explicitly requested"

java - 从数组中选择一个随机值

java - Spring Boot ArrayList/JSON : add all Elements of a certain type to a list of this type

Java: Wicket 口无法找到组件

Java/Wicket - 如何阻止浏览器缓存页面?