Liferay Faces 和远程 javascript inside head

Liferay Faces and remote javascript inside head

我正在使用 Primefaces 6.0 和 Liferay 6.2.5 tomcat 包开发 Liferay Primefaces portlet。我使用的是 Liferay Faces 的旧版本控制方案。

然后我决定切换到当前版本 here 6.2、2.2、primefaces 和 maven。

我的问题是我有一些使用 primefaces gmap 组件的 portlet,所以我需要包含 google 映射 javascript,我用下面的部分做到了代码:

    <h:head>
        <script
            src="https://maps.google.com/maps/api/js?key=MY_KEY"
            type="text/javascript" />
    </h:head>

尽管这在之前工作得很好,但在我升级之后它就不能工作了。事实上,我不能使用上面的代码包含任何脚本。 help/workarounds 要在 head 标签中包含远程 javascript 吗?

编辑:FACES-2974 已在 Bridge Impl 4.1.0 中修复。

这是 Liferay Faces Bridge 4.0.0(以及 3.0.02.0.0)中的 regression bug (FACES-2974)

要解决此问题,您可以创建一个具有 name 属性的复合组件。该名称必须以“css”或“js”结尾,并且每个视图应该是唯一的,以确保它始终被加载。例如,创建以下 resources/workaround/headElements.xhtml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<ui:component xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:cc="http://xmlns.jcp.org/jsf/composite" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.w3.org/1999/xhtml http://www.w3.org/2002/08/xhtml/xhtml1-transitional.xsd">

    <!-- Workaround for https://issues.liferay.com/browse/FACES-2974 -->
    <cc:interface>
        <cc:attribute name="name" required="true" />
    </cc:interface>

    <cc:implementation>
        <cc:insertChildren />
    </cc:implementation>

</ui:component>

要将此组件与上述 google 地图脚本一起使用:

<h:head>
    <workaround:headElements name="#{view.viewId}.js">
        <script src="https://maps.google.com/maps/api/js?key=MY_KEY"
        type="text/javascript" /></script>
    </workaround:headElements>
    <!-- ... -->
</h:head>