配置正确的@ResourceDependency找不到资源

时间:2017-06-15 03:55:52

标签: single-page-application jsf-2.2 custom-component

我的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文件,在浏览器中,我可以看到两个奇怪的网址 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 注释,我会得到 TWO 错误的网址,一个关于CSS,另一个关于JS,与...相关PrimeFaces资源,当我确定我自己的JS文件的位置是正确的吗? (否则 h:outputScript 也不会起作用)

使用WildFly 10.1.0.Final附带的Mojarra 2.2.13.SP1和WildFly 9.0.2.Final附带的Mojarra 2.2.12进行测试

任何帮助都会有很大的帮助!

[UPDATE]

看起来问题可能与我们处理页面导航的方式有关。我们使用SPA方法,其中Facelet模板内部有一个大的面板组区域,并带有动态JSF include 指令。页面是在执行AJAX后动态包含在模板面板组中的XHTML片段。

似乎 @ResourceDependency 仅在第一次创建View时呈现相应的HTML资源链接。正如我们使用SPA一样,从JSF的角度来看,我们的View永远不会改变。我们使用 include 指令处理所有使用AJAX片段更新的页面导航。

作为测试,我将我的组件的标签放在Facelet模板本身,而不是XHTML片段......并且链接按预期呈现!

如果有人可以确认这种行为,那将会很棒......如果有任何优雅的解决方案。

到目前为止,我们必须在模板定义上手动包含所需的HTML资源。

1 个答案:

答案 0 :(得分:0)

事实证明,升级到PrimeFaces 6.1时问题就消失了。可能Kukeltje是对的,PF 5.3 Resource Renderer有一些bug。

简而言之,在开发自己的JSF PrimeFaces组件时,PF 5.3在某些情况下不会呈现JSF组件的@ResourceDependency注释,如下所述:使用SPA方法和XHTML片段。

转向PF 6.1解决了这个问题。如果无法升级,我们必须使用outputScript标记在片段中手动包含所需的JS / CSS资源。