primefaces 5.2 中的表达式语言更改

Posted

技术标签:

【中文标题】primefaces 5.2 中的表达式语言更改【英文标题】:Expression language change with primefaces 5.2 【发布时间】:2015-07-17 14:46:34 【问题描述】:

在 primefaces 5.1 中,只在托管 bean 中引用 getter 没有问题

<ui:param name="curSearch" value="#searchBL.getSelectedSearch()" />

改成primefaces 5.2.2我要做的

<ui:param name="curSearch" value="#searchBL.selectedSearch" />

并提供一个 getter 和一个 setter。为什么?

例外:

09:35:29,178 SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (http-/0.0.0.0:9090-6) Error Rendering View[/views/main.xhtml]: javax.el.ELException: /sections/search/searchOptions.xhtml @23,111 value="#curSearch.sortPropertyName": /sections/search/firstSearchTab.xhtml @44,53 value="#curSearch": /sections/searchMaskContent.xhtml @38,74 value="#searchBL.getSelectedSearch()": Cannot find method 'getSelectedSearch' in 'class SearchBL$Proxy$_$$_WeldClientProxy'
at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:103) [jsf-impl-2.2.10.jar:2.2.10]
at org.primefaces.el.ValueExpressionAnalyzer.intercept(ValueExpressionAnalyzer.java:69) [primefaces-5.2.2.jar:5.2.2]
at org.primefaces.el.ValueExpressionAnalyzer.getReference(ValueExpressionAnalyzer.java:27) [primefaces-5.2.2.jar:5.2.2]
at org.primefaces.metadata.BeanValidationMetadataExtractor.extractPropertyDescriptor(BeanValidationMetadataExtractor.java:64) [primefaces-5.2.2.jar:5.2.2]
at org.primefaces.metadata.BeanValidationMetadataExtractor.extractConstraintDescriptors(BeanValidationMetadataExtractor.java:51) [primefaces-5.2.2.jar:5.2.2]
at org.primefaces.metadata.BeanValidationMetadataExtractor.extractDefaultConstraintDescriptors(BeanValidationMetadataExtractor.java:46) [primefaces-5.2.2.jar:5.2.2]
at org.primefaces.component.outputlabel.OutputLabelRenderer.isNotNullDefined(OutputLabelRenderer.java:139) [primefaces-5.2.2.jar:5.2.2]
at org.primefaces.component.outputlabel.OutputLabelRenderer.encodeEnd(OutputLabelRenderer.java:121) [primefaces-5.2.2.jar:5.2.2]
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919) [jsf-api-2.2.10.jar:2.2]
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312) [jsf-impl-2.2.10.jar:2.2.10]
at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:114) [jsf-impl-2.2.10.jar:2.2.10]

我用的是 JUEL EL,也许这就是问题所在?

【问题讨论】:

你能提供更多的上下文吗? &lt;ui:param&gt; 不是来自 PrimeFaces。它来自 Facelets。 # 的东西也不是来自 PrimeFaces。它来自 JSF 和容器。所以很奇怪它的行为受到 PrimeFaces 升级的影响。这更有可能是一种误解。 我使用 juel 2.2.7。如果我只将 pf 版本从 5.1.17 更改为 5.2.2,我会收到此异常。使用 5.1.17 它可以正常工作。 ui:include 只是一个例子。我不得不在几个地方更改它(顺便切换回 5.1.17 以解决另一个问题) 看起来他们以不兼容的方式更改了ValueExpressionAnalyzer。报告问题。 只是想知道这如何导致 5.2 发布。 【参考方案1】:

根据堆栈跟踪,您有一个&lt;p:outputLabel indicateRequired="true"&gt;,它想检查是否在关联的bean 属性上定义了任何@NotNull。 PrimeFaces 正在使用它自己开发的 org.primefaces.el.ValueExpressionAnalyzer 来分解表示与标签组件关联的输入组件值的 EL 表达式。

但是,在 5.2 中,changed 与 5.1 相比是 issue 8093 对空嵌套属性的 EL 检查失败的修复结果。现在它不再区分方法表达式了。最好的办法是向 PrimeFaces 人员报告 issue,并告诉他们查看 OmniFaces org.omnifaces.el.ExpressionInspector 如何以正确的方式进行 EL 表达式分析工作。

不过,您将只读值称为所需输入组件的值,这有点奇怪。

【讨论】:

以上是关于primefaces 5.2 中的表达式语言更改的主要内容,如果未能解决你的问题,请参考以下文章

如何更改primeFaces选择列表按钮的顺序

使用分页在primefaces数据网格上更改页面时更新组件

Spring表达式语言 之 5.1 概述 5.2 SpEL基础(拾叁)

Primefaces:如何更改日历字段按钮上的默认图标?

Primefaces 中全局更改的默认样式

如何从jsf / primefaces中的托管bean向页面添加组件[重复]