迁移至JBoss EAP7.4时JSP废弃ExpressionEvaluator替换方案咨询
解决JSP自定义Tag中ExpressionEvaluator废弃及类型转换异常问题
问题原因
JBoss EAP 7.4 基于 Servlet 3.1/JSP 2.3 规范,ExpressionEvaluator 已被废弃,旧API在新容器中的表达式求值逻辑发生变化,导致无法将字符串表达式正确转换为Detail类型,抛出IllegalArgumentException。
替换方案:使用ExpressionFactory和ValueExpression
JSP 2.1 引入的ExpressionFactory和ValueExpression是ExpressionEvaluator的替代方案,以下是具体的代码替换步骤:
1. 获取ExpressionFactory实例
通过容器提供的JspFactory获取ExpressionFactory实例,无需手动实现抽象类。
2. 创建ValueExpression并求值
用createValueExpression定义表达式与目标类型,再通过getValue方法完成求值。
替换后的代码示例
// 替换原ExpressionEvaluator相关代码 ExpressionFactory expressionFactory = JspFactory.getDefaultFactory() .getJspApplicationContext(pageContext.getServletContext()) .getExpressionFactory(); // 构造ValueExpression,确保detail是标准EL表达式(如"${detailObj}") ValueExpression valueExpr = expressionFactory.createValueExpression( pageContext.getELContext(), detail, Detail.class ); try { dettaglio = (Detail) valueExpr.getValue(pageContext.getELContext()); } catch (ELException e) { // 处理表达式求值异常,转换为Tag规范的异常类型 throw new JspTagException("Failed to evaluate detail expression", e); }
关键说明
- EL表达式格式:确保
detail变量是标准EL表达式(如"${yourDetailVariable}"),若原代码中detail是直接字符串值而非EL表达式,需额外处理字符串到Detail的转换逻辑(比如调用自定义转换方法)。 - 依赖兼容:JBoss EAP 7.4已内置JSP/EL相关API,保持
javax.servlet-api的scope=provided配置即可,无需额外引入依赖。 - 异常处理:新API用
ELException封装求值错误,建议捕获后转换为JspTagException,符合自定义Tag的异常处理规范。
内容的提问来源于stack exchange,提问作者user3804769
相关产品推荐
相关产品推荐

