Xpages 如何从JavaBean调用临时SSJS

Xpages 如何从JavaBean调用临时SSJS,xpages,serverside-javascript,Xpages,Serverside Javascript,我需要从与此类似的Javabean调用ssjs。问题是我需要执行的代码来自配置文档,可能看起来像: getComponent("xxx").getValue(); 我已经建立了一个版本,可以: String compute = doc.getItemValueString("SSJSStuff"); String valueExpr = "#{javascript:" + compute + "}"; FacesC

我需要从与此类似的Javabean调用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();
但是我在执行JavaScript计算表达式时,在xxx:com.ibm.xsp.Exception.EvaluationExceptionEx:Error中得到了异常“


我想我就在附近,但我看不到山那边。。有什么想法吗?

有几种可能性:

  • 变量compute为空

  • compute包含非法字符

  • compute中的代码格式不正确/没有正确的语法

  • SSJS代码中未返回任何对象:

    如果您的SSJS代码没有返回任何内容,vb.getValue(fc)将返回null。toString()将失败。要防止出现这种情况,应显式强制转换返回对象:

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

    斯文

    编辑
    在重新阅读您的文章之后,我看到您希望在动态SSJS代码中使用getComponent。这对于添加到javax.faces.application.application的值绑定不起作用。为此,您必须改用com.ibm.xsp.page.compiled.expressionevaluationImpl对象:

    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);
    

    答案是#4-没有返回任何对象,因为该组件在XSP生命周期的该点不可用。我通过将NotesDocument从数据源传递到javabean方法来解决这个问题,这样我就可以使用实际的Notes字段。不过,我将更深入地研究ExpressionEvaluatorImpl,因为它对本项目的其他部分具有承诺/在javax.script.ScriptEngine中,有没有一种方法可以将对象注入到SSJS求值中,比如
    put(key,object)
    ?我想对Java文档集合中的所有文档评估相同的脚本,最后使用javax.script.ScriptEngine并在那里添加Domino对象,效果很好。我正在评估一个包含“doc.getItemValue(..”的SSJS字符串。我需要添加Java中的“doc”对象,以便将其包含在评估中。