如何从一个Java Bean叫特设SSJS(How to call ad hoc SSJS from

2019-09-16 18:51发布

我需要从一个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"

我想我接近,但我没有看到在山上..有什么想法?

Answer 1:

这有几种可能:

  1. 变量计算为空
  2. 计算含有非法字符
  3. 内部计算的代码的格式不正确/不具有正确的语法
  4. 没有对象返回在SSJS代码:

    如果您SSJS代码不返回的东西,vb.getValue(FC)返回null。 一个toString()将失败。 为了防止这种情况,你应该明确地投你回来的对象:

     vreslt = (String) vb.getValue(fc); 

希望这可以帮助

斯文

编辑
在重新阅读你的文章后,我看到你想要做一个getComponent在动态SSJS代码。 这不会增值到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);


文章来源: How to call ad hoc SSJS from a Java Bean