【问题标题】:JSPG0122E: Unable to parse EL function in Websphere 8JSPG0122E: 无法解析 Websphere 8 中的 EL 函数
【发布时间】:2013-07-19 10:41:43
【问题描述】:

我正在将 Web 应用程序从 Websphere 6.1 移动到 Websphere 8,并且在我的 JSP 页面之一中遇到以下错误:

com.ibm.ws.jsp.translator.JspTranslationException: JSPG0227E: 翻译 /jsp/myJsp.jsp: /jsp/myJsp.jsp(863,4) 时捕获异常 --> JSPG0122E: 无法解析 EL 函数 $ {不是空的 rowVo.operation.package}。在 com.ibm.ws.jsp.translator.visitor.validator.ELValidator.validateElFunction(ELValidator.java:500) 在 com.ibm.ws.jsp.translator.visitor.validator.ELValidator.validateELExpression(ELValidator.java:122)在 com.ibm.ws.jsp.translator.visitor.validator.ELValidator.validateELExpression(ELValidator.java:149) 在 com.ibm.ws.jsp.translator.visitor.validator.ValidateVisitor.validateCustomTagAttribute(ValidateVisitor.java:1757)在 com.ibm.ws.jsp.translator.visitor.validator.ValidateVisitor.validateCustomTagAttributeValues(ValidateVisitor.java:1405) 在 com.ibm.ws.jsp.translator.visitor.validator.ValidateVisitor.visitCustomTagStart(ValidateVisitor.java:294)在 com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:366) 在 com.ibm.ws.jsp.translator.visitor.JspVisitor.processChildren(JspVisitor.java:419) 在 com.ibm .ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:369) at com.ibm.ws.jsp.translator.visitor.JspVisitor.processChildren(JspVisit or.java:419) 在 com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:369) 在 com.ibm.ws.jsp.translator.visitor.JspVisitor.processChildren(JspVisitor.java: 419) 在 com.ibm.ws.jsp.translator.visitor.JspVisitor.visit(JspVisitor.java:216) 在 com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:234) 在 com .ibm.ws.jsp.translator.JspTranslator.processVisitors(JspTranslator.java:127) 在 com.ibm.ws.jsp.translator.utils.JspTranslatorUtil.translateJsp(JspTranslatorUtil.java:254) 在 com.ibm.ws.jsp .translator.utils.JspTranslatorUtil.translateJspAndCompile(JspTranslatorUtil.java:121)

JSP 文件中的违规部分如下所示:

<c:forEach var="rowVo"
  items="${searchResultContainer.searchResultRowsPage}"
  varStatus="opStatus">
    <c:if test="${not empty rowVo.operation.jobscopeDescription}">
        <td>${rowVo.operation.jobscopeDescription}</td>
    </c:if>
    <c:if test="${not empty rowVo.operation.package}">
        <td>${rowVo.operation.package}</td>
    </c:if>
</c:forEach>

真正让我困惑的是,异常是从第三个EL 表达式引发的,而第二个几乎相同。

Operation 是一个生成的类:

public class Operation {

    //Other properties omitted

    @XmlElement(name = "package")
    protected List<Package> _package;
    protected List<String> jobscopeDescription;
    public List<Package> getPackage() {
        if (_package == null) {
            _package = new ArrayList<Package>();
        }
        return this._package;
    }    
    public List<String> getJobscopeDescription() {
        if (jobscopeDescription == null) {
            jobscopeDescription = new ArrayList<String>();
        }
        return this.jobscopeDescription;
    }
}

这些文件在迁移期间没有更改,并且在 WAS 6.1 上运行良好。有人知道这里出了什么问题吗?

【问题讨论】:

    标签: java jstl el websphere-6.1 websphere-8


    【解决方案1】:

    负责检查保留关键字用作 EL 变量标识符的代码在 WebSphere Application Server v8.0 及更高版本中得到了增强,使检查更加严格。变量检查代码不仅会检查保留的 EL 关键字,还会检查 Java 保留的关键字。

    查看这篇文章了解更多信息:http://www-01.ibm.com/support/docview.wss?uid=swg21642419&myns=swgws&mynp=OCSSEQTP&mync=A

    【讨论】:

    • 啊,完美。我一直在寻找类似的东西来解释它,但找不到任何东西。谢谢!
    • 不错! +1。 IBM 产品很难找到类似的东西。
    【解决方案2】:

    此错误似乎是由于 Websphere 8 无法解析包含 package 属性或变量的 EL 表达式。比如把上面改成

    <c:if test="${not empty rowVo.operation.getPackage()}">
    

    成功了。

    我还用这个小sn-p对我的理论做了一点测试:

    <c:set var="salary" scope="session" value="${2000*2}"/>
    <c:out value="Salary: ${salary}"/>
    

    运行良好并产生预期的输出Salary: 4000。不过,

    <c:set var="package" scope="session" value="${2000*2}"/>
    <c:out value="Salary: ${package}"/>
    

    产生与上述相同的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多