6

我在 JSF2.3 中使用 primefaces

这是我的依赖项的方式

    dependencies {

    providedCompile 'javax.servlet:javax.servlet-api:4.0.0'
    compile group: 'javax.faces', name: 'javax.faces-api', version: '2.3'
    compile group: 'org.glassfish', name: 'javax.faces', version: '2.3.3'
    compile 'javax.servlet:jstl:1.2'
    compile 'org.jboss.weld.servlet:weld-servlet:2.4.5.Final'
    compile group: 'org.primefaces', name: 'primefaces', version: '6.2'
}

我的 jsf 文件非常基本

   <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
</h:head>
<f:view>
    <h:outputLabel value="Hello, world"/>
    <h:form>
        <p:selectOneMenu value="#{testView.chosen}"
                         style="width:200px">
            <f:selectItem itemLabel="Select listing template"/>
            <f:selectItems value="#{testView.list}"/>
            <p:ajax event="change" process="@this" update="@all"/>
        </p:selectOneMenu>
    </h:form>
</f:view>
</html>

还有我的 viewScoped bean

    @Named
@ViewScoped
public class TestView implements Serializable {
String chosen;
List<String> list;

@PostConstruct
public void setup(){
    list = new ArrayList<>();
    list.add("alpha");
    list.add("gamma");
    list.add("bravo");
}

为简单起见,省略了 getter 和 setter。

问题是我曾经使用过(jsf 2.2,primefaces 6.1)并且一切正常。

升级后(jsf 2.3,primefaces6.2),每当事件更改时我都会遇到问题(当我更改选择被触发时)

错误是

Uncaught TypeError: Cannot read property 'error' of null
    at Object.<anonymous> (core.js.xhtml?ln=primefaces&v=6.2:3)
    at i (jquery.js.xhtml?ln=primefaces&v=6.2:2)
    at Object.fireWith [as resolveWith] (jquery.js.xhtml?ln=primefaces&v=6.2:2)
    at A (jquery.js.xhtml?ln=primefaces&v=6.2:4)
    at XMLHttpRequest.<anonymous> (jquery.js.xhtml?ln=primefaces&v=6.2:4)

jsf2.3 和 primefaces 之间是否存在任何冲突的 javascript?

4

4 回答 4

6

AFAICS 这是 Mojarra 中的一个错误,我会在那里创建一个问题。似乎组件资源在回发中可用(请参阅 PrimeFaces HeadRenderer),但不知何故,它们没有在 head 标记内的响应中呈现。

注意:这只会发生在 update=@all 的情况下,否则头标签将不会被替换。实际上 update=@all 不应该被使用,只有在真的真的有必要的时候。

于 2018-03-15T15:44:33.170 回答
2

mojarra 存在问题,因为当您要渲染“全部”时,它应该发送所有文件。

同时,这里提到了另一种解决方案: https ://github.com/javaserverfaces/mojarra/issues/4354

您可以在 primeface 加载后执行以下脚本,因此它可以更改 PF 呈现 HEAD 的方式:

https://github.com/javaserverfaces/mojarra/files/2626517/primefaces_replacehead_hack.js.txt

有了它,PF 不会替换头部,代码可能会继续工作。

它对我有用。

于 2018-12-01T20:06:41.057 回答
0

关于你的事实问题(这是 imo 错误地表述),

jsf2.3 和 primefaces 之间是否存在任何冲突的 javascript?

答案是:

不,那里没有。由于 PrimeFaces 展示是“在 Mojarra-2.3.2 上运行 PrimeFaces-6.2”,根据实际操作展示的底部:https ://www.primefaces.org/showcase/

但是您对我的编辑表明(就像我在评论中发布的那样)您在实际运行的项目中有多个 PF 版本。

于 2018-03-02T15:08:18.687 回答
0

我可以使用简化标记在 PrimeFaces 6.2 和 6.3-SNAPSHOT ShowCase 上创建此问题。交付的内容中缺少 primefaces 核心 javascript 文件。更新主体后,全局 primefaces 变量未定义/为空。使用 @form 而不是 @all 仍然有效。

(缩小)index.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui" template="/WEB-INF/template.xhtml">

<ui:define name="body">
    <h:form>
        <p:commandButton value="BUTTON_TEXT" update="@all"
            process="@none" />
    </h:form>
</ui:define>

(缩小)template.xhtml

<!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui">
    <h:head />
    <h:body>
        <ui:insert name="body"></ui:insert>
    </h:body>
    </html>

堆栈跟踪:

VM47:1 Uncaught TypeError: Cannot read property 'cw' of null
    at <anonymous>:1:12
    at p (jquery.js.xhtml?ln=primefaces&v=6.2:2)
    at Ja (jquery.js.xhtml?ln=primefaces&v=6.2:3)
    at r.fn.init.append (jquery.js.xhtml?ln=primefaces&v=6.2:3)
    at r.fn.init.<anonymous> (jquery.js.xhtml?ln=primefaces&v=6.2:3)
    at T (jquery.js.xhtml?ln=primefaces&v=6.2:3)
    at r.fn.init.html (jquery.js.xhtml?ln=primefaces&v=6.2:3)
    at Object.updateBody (core.js.xhtml?ln=primefaces&v=6.2:3)
    at Object.updateElement (core.js.xhtml?ln=primefaces&v=6.2:3)
    at Object.doUpdate (core.js.xhtml?ln=primefaces&v=6.2:3)

打开:https ://github.com/javaserverfaces/mojarra/issues/4354

于 2018-03-15T08:28:23.630 回答