【问题标题】:@ResourceDependency with correct configuration does not find the resource正确配置的@ResourceDependency 找不到资源
【发布时间】:2017-11-17 09:39:24
【问题描述】:

我的 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 文件,在浏览器中我可以看到 两个 奇怪的 URL,其中 undefined.cssundefined.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.0.Final 随附的 Mojarra 2.2.13.SP1 和 WildFly 9.0.2.Final 随附的 Mojarra 2.2.12 测试

任何帮助将不胜感激!

[更新]

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

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

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

如果有人能确认这种行为,那就太好了......如果有任何优雅的解决方案。

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

【问题讨论】:

  • 感谢 Kukeltje。我很清楚如何使用 h:outputScript。我已经更新了我的问题。无论我采用哪种方法,它总是有效的。仅当尝试使用 @ResourceDependency 注释自动将 javascript 包含在我的组件中时,才会出现此问题。在这种情况下,无法包含 javascript。我仍然无法理解这里出了什么问题......
  • 在使用 @ResourceDependency 和使用 outputScript 时,我已经用 URL 更新了我的问题。是的,它们是不同的。但问题是......为什么????
  • 你可以在没有 PrimeFaces 的项目中尝试吗?你可以试试PF 6.1吗?也许PF“头部渲染器”搞砸了。 (只是“猜测”,没有时间尝试复制自己)或者您的组件是否扩展了 PrimeFaces 基础组件?
  • 是的,我的组件从 Widget 类扩展,渲染器从 CoreRenderer 扩展......但是......我想出了一个可能的原因......我正在使用 SPA 方法,页面只是通过 AJAX 在面板组上使用 JSF 包含指令更新 XHTML 片段。如果组件在这样的 SPA 片段中使用,那么 @ResourceDependency 注释似乎根本不起作用。如果我在 JSF 模板上使用该组件,该组件在第一次创建视图时呈现......那么它按预期工作......我稍后会尝试用这些发现更新我的问题。
  • 如果您不在@ResourceDependency 上使用target = "head" 怎么办?但是例如target="body" 或 @this 或 parent 或...

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


【解决方案1】:

事实证明,升级到 PrimeFaces 6.1 后问题就消失了。可能 Kukeltje 是对的,PF 5.3 Resource Renderer 存在某种错误。

简而言之,在开发您自己的 JSF PrimeFaces 组件时,PF 5.3 在某些情况下不会呈现 JSF 组件的 @ResourceDependency 注解,例如这里描述的情况:使用带有 XHTML 片段的 SPA 方法。

迁移到 PF 6.1 解决了这个问题。如果无法升级,我们必须手动将所需的 JS/CSS 资源包含在带有 outputScript 标签的片段中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2016-08-12
    • 2012-10-27
    • 2021-12-16
    相关资源
    最近更新 更多