XPages:可以从Java调用SSJS函数吗?

XPages:可以从Java调用SSJS函数吗?,java,xpages,xpages-ssjs,Java,Xpages,Xpages Ssjs,我希望将SSJS中的函数参数(即FunctionObject)传递给bean,然后将该函数作为一种回调函数调用。例如: companyBox.setGenerator(function() { return @DbColumn("", SystemBean.getViewName(), 2); }); 这样我就可以在需要实现值时调用该函数 我预计这会失败,因为缺少SSJS上下文,但这个想法仍然很诱人。或者可能是因为函数无法序列化,但这到底意味着什么我还不知道

我希望将SSJS中的函数参数(即FunctionObject)传递给bean,然后将该函数作为一种回调函数调用。例如:

companyBox.setGenerator(function() {
    return @DbColumn("", SystemBean.getViewName(), 2);              
});
这样我就可以在需要实现值时调用该函数

我预计这会失败,因为缺少SSJS上下文,但这个想法仍然很诱人。或者可能是因为函数无法序列化,但这到底意味着什么我还不知道。在本例中,companyBox对象是从具有view/page作用域的托管bean创建的:一旦当前页面消失,我就不再需要它了


欢迎提供线索……

是的。你有两个选择

1) 使用“值绑定”。 Thomas Adrian评论了Sven Hasselbach关于调用外部SSJS库(顺便说一句,很酷的东西)

简而言之:调用内部JSF引擎来解析值绑定——什么可以是SSJS(包括对方法的调用)或任何其他绑定(EL)。它使用“动态”构造的表达式,作为字符串传递

2) 使用函数对象作为参数。该技术的蓝图是可用的。您的评论表明您知道
com.ibm.jscript
包。好的,
com.ibm.jscript.std.FunctionObject
类的
call()
方法的当前实现将支持您的经验观察:

/*     */   public FBSObject call(FBSValueVector paramFBSValueVector) {
/* 163 */     return null;
/*     */   }
提示:强烈建议JD Eclipse和JD Eclipse重新对齐


另一个具有更复杂签名的调用方法是要走的路。例如,它用于定义自定义@函数。

我不知道什么是可能的。。。恕我直言,我不知道你为什么要这么做。如果您正在使用Java,那么就转到Java并完成它。试图将它与@functions混合在一起对我来说似乎不合适,因为你可以用Java自己完成所有的工作。也许这会对@David有所帮助:这是一个我还不能改变的管理模块,它在SSJS中。bean是一个多用途类,它需要一个生成可选值的函数,例如下拉列表。我只想调用这个函数。我确实可以传递它的名字,但我只是问自己:传递函数作为一个对象,这样它就可以被调用(返回)不是更好吗?@Thomas:谢谢你的链接,我看到了这个问题,然后。。。我忘了。这样可能是可行的,但我必须将名称(或整个函数)作为字符串传递。不理想,但如果这是唯一的方法,我可能会这样做。嗯,我希望我可以在95%的情况下在公式语言中使用公式字符串。这种情况似乎已经结束,但我仍然有兴趣知道是否可以使用Java中的FunctionObject调用函数。这与我想要的不完全一样,例如,从Java调用SSJS函数,函数作为函数参数传递。顺便说一下:Thomas的问题是前面的问题……正如您在上面的代码中看到的,call方法不起作用-它只返回null。而其他方法的问题是它们需要正确的ExecutionContext。否则,您的调用将无法使用SSJS“附加组件”,如@Formula和其他用于js解释器(f.e.println)的IBM扩展。因此,这是错误的“调用”;-)谢谢大家,特别是OpenNTF上的代码片段。