正确配置的@ResourceDependency 找不到资源
@ResourceDependency with correct configuration does not find the resource
我的 JAR 组件中的以下文件夹下有一个 javascript 文件:
/src/main/resources/META-INF/resources/default/javascript/jquery.marquee.js
如果我使用以下 @ResourceDependency 注释创建自定义 JSF 组件:
@ResourceDependency(library = "default", name = "javascript/jquery.marquee.js", target = "head")
找不到javascript文件,在浏览器中我可以看到两个奇怪的URLs和undefined.css 和 undefined.js 作为 URL 的一部分,还引用了 PrimeFaces 库 ??
http://localhost:8080/acio/javax.faces.resource/undefined/undefined.css.xhtml?ln=primefaces&v=5.3
http://localhost:8080/acio/javax.faces.resource/undefined/undefined.js.xhtml?ln=primefaces&v=5.3
但是,如果我手动将脚本包含在 XHTML 模板中,如下所示:
<h:outputScript library="default" name="javascript/jquery.marquee.js" />
然后一切都像预期的那样正常工作,预期的URL如下:
http://localhost:8080/acio/javax.faces.resource/javascript/jquery.marquee.js.xhtml?ln=default
对此我百思不得其解
为什么,如果我使用 @ResourceDependency 注释,我会得到 两个 个错误的 URL,一个关于CSS 和另一个关于 JS,与 PrimeFaces 资源相关,当我确定我自己的 JS 文件的位置是正确的时候? (否则 h:outputScript 将无法正常工作)
使用 WildFly 10.1 附带的 Mojarra 2.2.13.SP1 进行测试。0.Final,以及 WildFly 9.0 附带的 Mojarra 2.2.12。2.Final
如有任何帮助,我们将不胜感激!
[更新]
看来问题可能与我们处理页面导航的方式有关。我们正在使用 SPA 方法,使用内部有一个大面板组区域的 Facelet 模板,使用动态 JSF include 指令。页面是在 AJAX 执行后动态包含在模板面板组中的 XHTML 片段。
看来 @ResourceDependency 仅在第一次创建视图时呈现相应的 HTML 资源 link。当我们使用 SPA 时,从 JSF 的角度来看,我们的视图永远不会改变。我们使用 include 指令处理所有带有 AJAX 片段更新的页面导航。
作为测试,我将我的组件的标记放在 Facelet 模板本身中,而不是 XHTML 片段...并且 link 按预期呈现!
如果有人可以确认此行为......并且有任何优雅的解决方案,那就太好了。
到目前为止,我们必须在模板定义中手动包含所需的 HTML 资源。
事实证明,升级到 PrimeFaces 6.1 后问题就消失了。可能 Kukeltje 是对的,PF 5.3 资源渲染器有一些错误。
简而言之,在开发您自己的 JSF PrimeFaces 组件时,PF 5.3 在某些情况下不会呈现 JSF 组件的 @ResourceDependency 注释,例如此处描述的情况:使用带有 XHTML 片段的 SPA 方法。
迁移到 PF 6.1 可以解决问题。如果无法升级,我们必须在带有 outputScript 标签的片段中手动包含所需的 JS / CSS 资源。
我的 JAR 组件中的以下文件夹下有一个 javascript 文件: /src/main/resources/META-INF/resources/default/javascript/jquery.marquee.js
如果我使用以下 @ResourceDependency 注释创建自定义 JSF 组件:
@ResourceDependency(library = "default", name = "javascript/jquery.marquee.js", target = "head")
找不到javascript文件,在浏览器中我可以看到两个奇怪的URLs和undefined.css 和 undefined.js 作为 URL 的一部分,还引用了 PrimeFaces 库 ??
http://localhost:8080/acio/javax.faces.resource/undefined/undefined.css.xhtml?ln=primefaces&v=5.3
http://localhost:8080/acio/javax.faces.resource/undefined/undefined.js.xhtml?ln=primefaces&v=5.3
但是,如果我手动将脚本包含在 XHTML 模板中,如下所示:
<h:outputScript library="default" name="javascript/jquery.marquee.js" />
然后一切都像预期的那样正常工作,预期的URL如下:
http://localhost:8080/acio/javax.faces.resource/javascript/jquery.marquee.js.xhtml?ln=default
对此我百思不得其解
为什么,如果我使用 @ResourceDependency 注释,我会得到 两个 个错误的 URL,一个关于CSS 和另一个关于 JS,与 PrimeFaces 资源相关,当我确定我自己的 JS 文件的位置是正确的时候? (否则 h:outputScript 将无法正常工作)
使用 WildFly 10.1 附带的 Mojarra 2.2.13.SP1 进行测试。0.Final,以及 WildFly 9.0 附带的 Mojarra 2.2.12。2.Final
如有任何帮助,我们将不胜感激!
[更新]
看来问题可能与我们处理页面导航的方式有关。我们正在使用 SPA 方法,使用内部有一个大面板组区域的 Facelet 模板,使用动态 JSF include 指令。页面是在 AJAX 执行后动态包含在模板面板组中的 XHTML 片段。
看来 @ResourceDependency 仅在第一次创建视图时呈现相应的 HTML 资源 link。当我们使用 SPA 时,从 JSF 的角度来看,我们的视图永远不会改变。我们使用 include 指令处理所有带有 AJAX 片段更新的页面导航。
作为测试,我将我的组件的标记放在 Facelet 模板本身中,而不是 XHTML 片段...并且 link 按预期呈现!
如果有人可以确认此行为......并且有任何优雅的解决方案,那就太好了。
到目前为止,我们必须在模板定义中手动包含所需的 HTML 资源。
事实证明,升级到 PrimeFaces 6.1 后问题就消失了。可能 Kukeltje 是对的,PF 5.3 资源渲染器有一些错误。
简而言之,在开发您自己的 JSF PrimeFaces 组件时,PF 5.3 在某些情况下不会呈现 JSF 组件的 @ResourceDependency 注释,例如此处描述的情况:使用带有 XHTML 片段的 SPA 方法。
迁移到 PF 6.1 可以解决问题。如果无法升级,我们必须在带有 outputScript 标签的片段中手动包含所需的 JS / CSS 资源。