Java11+WebLogic14下Javax.el.PropertyNotFoundException问题求助
问题:解决JSF中
PropertyNotFoundException(String无severity属性) 环境信息
- Java 11
- WebLogic 14
相关代码
JSFHelper类的obtenirMessageGlobal方法
public static List<FacesMessage> obtenirMessageGlobal() { FacesContext context = FacesContext.getCurrentInstance(); Iterator<FacesMessage> iter = context.getMessages(); List<FacesMessage> globalMessages = new ArrayList<FacesMessage>(); FacesMessage msg; // Message global while (iter.hasNext()) { msg = iter.next(); if (msg.getSummary() != null && !"".equalsIgnoreCase(msg.getSummary())) globalMessages.add(msg); } // remove specifics messages globalMessages.removeAll(obtenirMessageSpecifique()); return globalMessages; }
Facelets页面代码片段
<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:c="http://java.sun.com/jstl/core" xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich" xmlns:commun="http://xx.xx.xxxx.xxx/commun"> . . . <h:outputText value="#{message}" rendered="#{not empty message}"/> <a4j:outputPanel id="messages" ajaxRendered="true"> <h:panelGroup styleClass="globalMessages" layout="block" rendered="#{not empty commun:obtenirMessageGlobal()}" style="border: none; padding: 0px" > <rich:dataList value="#{commun:obtenirMessageGlobal()}" var="message" style="margin-top: 0px; padding-left: 20px"> <h:graphicImage value="resource:///xx/xx/xxxx/xxx/commun/jsf/skins/dti/images/severity/#{message.severity.ordinal}.gif" /> <h:outputText value="#{message.summary}" styleClass="severity#{message.severity.ordinal}" /> </rich:dataList> </h:panelGroup> </a4j:outputPanel>
抛出的异常
javax.el.PropertyNotFoundException: /WEB-INF/taglib/fragments/uploadPanel.xhtml @37,114 value="resource:///xx/xx/xxxx/xxx/commun/jsf/skins/dti/images/severity/#{message.severity.ordinal}.gif": The class 'java.lang.String' does not have the property 'severity'.
解决方案
异常修复
异常核心原因是变量名冲突:页面中存在两个#{message}变量——一个是顶层的String类型变量(对应<h:outputText>),另一个是<rich:dataList>定义的局部FacesMessage变量。EL解析时顶层变量覆盖了局部变量,导致访问message.severity时将其当作String处理,抛出属性不存在异常。
修复方式二选一:
- 重命名dataList的局部变量:将
var="message"改为var="msg",同步修改内部引用:
<rich:dataList value="#{commun:obtenirMessageGlobal()}" var="msg" style="margin-top: 0px; padding-left: 20px"> <h:graphicImage value="resource:///xx/xx/xxxx/xxx/commun/jsf/skins/dti/images/severity/#{msg.severity.ordinal}.gif" /> <h:outputText value="#{msg.summary}" styleClass="severity#{msg.severity.ordinal}" /> </rich:dataList>
- 移除或重命名顶层变量:如果不需要
<h:outputText value="#{message}"/>,直接删除;如果需要,将其变量名改为globalMessage等不冲突的名称。
关于type="FacesMessage"属性的问题
JSF标准组件或RichFaces的dataList都不支持type属性来指定集合元素类型。不过可以通过两种方式确保类型安全:
- 优先解决变量名冲突:你的
obtenirMessageGlobal()已经返回List<FacesMessage>,只要变量名不重复,EL会自动识别元素类型,无需额外配置。 - EL显式类型转换(EL 3.0+支持):若仍存在类型歧义,可在表达式中强制转换,例如
#{(FacesMessage) msg.severity},但这属于兜底方案,不如变量名重命名简洁。
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

