我需要从类似于this issue的java bean调用ssjs。问题是我需要执行的代码来自配置文档,可能看起来像:
getComponent("xxx").getValue();
我已经构建了一个版本:
String compute = doc.getItemValueString("SSJSStuff");
String valueExpr = "#{javascript:" + compute + "}";
FacesContext fc = FacesContext.getCurrentInstance();
Application app = fc.getApplication();
ValueBinding vb = app.createValueBinding(valueExpr);
String vreslt = vb.getValue(fc).toString();
但我得到"Exception in xxx: com.ibm.xsp.exception.EvaluationExceptionEx: Error while executing JavaScript computed expression"
我想我很亲近,但我没有看到山上......有什么想法吗?
答案 0 :(得分:2)
有几种可能性:
您的SSJS代码中未返回任何对象:
如果您的SSJS代码未返回某些内容, vb.getValue(fc)将返回 null 。 toString()将失败。为了防止这种情况,您应该明确地转换返回的对象:
vreslt = (String) vb.getValue(fc);
希望这有帮助
斯文
修改强>:
重新阅读您的帖子后,我发现您想在动态SSJS代码中执行 getComponent 。这不适用于添加到 javax.faces.application.Application 的值绑定。为此,您必须使用 com.ibm.xsp.page.compiled.ExpressionEvaluatorImpl 对象:
String valueExpr = "#{javascript:" + compute + "}";
FacesContext fc = FacesContext.getCurrentInstance();
ExpressionEvaluatorImpl evaluator = new ExpressionEvaluatorImpl( fc );
ValueBinding vb = evaluator.createValueBinding( fc.getViewRoot(), valueExpr, null, null);
vreslt = (String) vb.getValue(fc);