我正在将Web应用程序从Websphere 6.1移动到Websphere 8,我在JSP
个页面中遇到以下错误:
com.ibm.ws.jsp.translator.JspTranslationException:JSPG0227E:翻译/jsp/myJsp.jsp时遇到异常:/jsp/myJsp.jsp(863,4) - > JSPG0122E:无法解析EL函数$ {not empty rowVo.operation.package}。 at com.ibm.ws.jsp.translator.visitor.validator.ELValidator.validateElFunction(ELValidator.java:500)at com.ibm.ws.jsp.translator.visitor.validator.ELValidator.validateELExpression(ELValidator.java:122) at com.ibm.ws.jsp.translator.visitor.validator.ELValidator.validateELExpression(ELValidator.java:149)at com.ibm.ws.jsp.translator.visitor.validator.ValidateVisitor.validateCustomTagAttribute(ValidateVisitor.java:1757) at com.ibm.ws.jsp.translator.visitor.validator.ValidateVisitor.validateCustomTagAttributeValues(ValidateVisitor.java:1405)at 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的com.ibm.ws.jsp.translator.visitor.JspVisitor.processChildren(JspVisitor.java:419) .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的com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:234)at com.ibm.ws.jsp.translator.visitor.JspVisitor.visit(JspVisitor.java:216)at 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;
}
}
是生成的类:
{{1}}
这些文件在迁移期间没有更改,并且在WAS 6.1上运行良好。有没有人知道这里有什么问题?
答案 0 :(得分:6)
在WebSphere Application Server v8.0及更高版本中,负责检查使用保留关键字作为EL变量标识符的代码得到了增强,从而使检查更加严格。变量检查代码不仅检查保留的EL关键字,还检查Java保留关键字。
有关详细信息,请参阅此文章:http://www-01.ibm.com/support/docview.wss?uid=swg21642419&myns=swgws&mynp=OCSSEQTP&mync=A
答案 1 :(得分:1)
似乎此错误是由于Websphere 8无法解析包含EL
属性或变量的package
表达式。例如,将上述内容更改为
<c:if test="${not empty rowVo.operation.getPackage()}">
让它发挥作用。
我还用这个小片段对我的理论进行了一些测试:
<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}"/>
产生与上述相同的错误。