如何从Java Bean调用ad hoc SSJS

时间:2012-04-25 22:00:46

标签: xpages serverside-javascript

我需要从类似于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"

我想我很亲近,但我没有看到山上......有什么想法吗?

1 个答案:

答案 0 :(得分:2)

有几种可能性:

  1. 变量 compute 为空
  2. compute 包含非法字符
  3. compute 中的代码格式错误/语法不正确
  4. 您的SSJS代码中未返回任何对象:

    如果您的SSJS代码未返回某些内容, vb.getValue(fc)将返回 null toString()将失败。为了防止这种情况,您应该明确地转换返回的对象:

    vreslt = (String) vb.getValue(fc);
    
  5. 希望这有帮助

    斯文

    修改
    重新阅读您的帖子后,我发现您想在动态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);