Worklight适配器之间共享代码



到目前为止,在我处理过的大多数情况下,Worklight Adapter的实现都非常琐碎,只有几行JavaScript。

在当前的项目中,使用WL5.0.6,我们有几个适配器,每个适配器都有几个过程。我们的特定后端需要一些通用逻辑来设置请求和解释响应。似乎是将公共代码重构为共享库的理想选择,但据我所见,适配器环境中没有"库"概念,除非我们想深入到Java中。

适配器之间是否存在代码重用模式?

我认为你是对的。目前还没有办法导入自定义JavaScript库。

有一种方法可以通过使用"load(xyz.js)"函数在Mozilla Rhino引擎中包含/加载Javascript文件,但这将使Worklight适配器无法部署。

但我注意到,这将使Worklight适配器无法部署。如果您在适配器中部署第二个*.js文件,您将得到以下错误消息:

Adapter deployment failed: Procedure 'getStories' is not implemented in the adapter's JavaScript file.

Worklight Server似乎每个适配器只能处理一个JavaScript文件。

我通过在Java代码中实现功能并将jar文件包含在Worklight war文件中,在适配器之间共享了一些通用功能。这对于通过JDBC调用存储的proc非常有用,JDBC可以处理多个out parm,还可以从内部后端服务检索PDF内容。jar需要位于适配器将部署到的worklight.war web应用程序的lib目录中。

在适配器中创建java对象的示例:

var parm = new org.apache.http.message.BasicNameValuePair("QBS_Reference_ID",refId);

在适配器之间共享JavaScript的一种方法是遵循如下模式:

CommonAdapter impl.js

var commonObject = {
  invokeBackend: function(input, options) {
    // Do stuff to check/modify input & options
    response = WL.Server.invokeHttp(input);
    // Do stuff to check/modify response
    return response;
  }
}
getCommonObject: function() {
  return commonObject;
}

NormalAdapter impl.js

function getSomeData(dataNumber) {
  var input = {
    method: 'get',
    returnedContentType: 'json',
    path: '/restservices/getsomedata',
  }
  return _getCommonObject().invokeBackend(input);
}
function _getCommonObject() {
  var invocationData = {
    adapter: 'CommonAdapter',
    procedure: 'getCommonObject',
    parameters: []
  }
  return WL.Server.invokeProcedure(invocationData);
}

在这种特殊情况下,通用适配器用于提供WL.Server.invokeHttp,周围的"包装器"函数,但它也可以用于提供任何其他实用程序函数。

这种模式的特别原因是,它允许WL.Server.invokeHttp在"调用"适配器的上下文中运行,这意味着将使用调用适配器的.xml文件中指定的端点(主机名、端口号等)。这确实意味着短_getCommonObject()函数必须在每个"正常"适配器中重复,但这只是一个相当小的样板。

请注意,此模式已与Worklight 6.1一起使用-不能保证它在未来或过去的版本中都能工作。

最新更新