You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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处理,抛出属性不存在异常。

修复方式二选一:

  1. 重命名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>
  1. 移除或重命名顶层变量:如果不需要<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:55:32