我正在将一个应用程序移植到仍然使用 JSP 的 JBoss EAP 7.4。大多数页面工作正常,但页面给我带来了麻烦。该页面使用链接到类的自定义 TLD 定义,该类扩展了
javax.servlet.jsp.tagext.TagSupport
;此类在 doEndTag() 方法中此时抛出 IllegalArgumentException,因为它无法将 String 转换为 Detail:
ExpressionEvaluator eval = pageContext.getExpressionEvaluator();
Object ob = eval.evaluate(detail, Detail.class, pageContext.getVariableResolver(), new FunctionMapper(){public Method resolveFunction(String arg0, String arg1){return null;}}); //Crashes here
dettaglio = (Detail)ob; //does not reach this
在我的依赖项中,我有 javax.servlet-api 版本 3.0.1(scope=provided),我让 JBoss 处理其余的依赖项。
现在这个 ExpressionEvaluator 已被弃用:
Deprecated. As of JSP 2.1, replaced by ExpressionFactory
ExpressionFactory 是抽象的,不提供“eval”方法,所以我不知道如何替换它。应该如何更换?我该如何解决这个错误?
谢谢。
我想我找到了解决方法:
ExpressionFactory factory = JspFactory.getDefaultFactory().getJspApplicationContext(pageContext.getServletContext()).getExpressionFactory();
ValueExpression valueExp = factory.createValueExpression(pageContext.getELContext(), "${"+getDetail()+"}", Detail.class);
dettaglio = (Detail) valueExp.getValue(pageContext.getELContext());
其中“详细信息”是我的 JSP 页面中的属性。唯一的区别是我必须简单地在 JSP 中编写要解析的变量的名称,而不是使用 ${} 符号。