问题描述
我遵循了本教程:https://ecmarchitect.com/alfresco-developer-series-tutorials/workflow/tutorial/tutorial.html 现在,我已经创建了一个 HelloWorld 工作流,并使用 Alfresco Maven SDK 为 Alfresco 6.2 成功部署了它。这是在服务器日志中打印 Hello World! 的相应 .bpmn 文件的一部分:
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1">
<extensionElements>
<activiti:executionListener event="start" class="org.alfresco.repo.workflow.activiti.listener.ScriptExecutionListener">
<activiti:field name="script">
<activiti:string>logger.log("Hello,World!");</activiti:string>
</activiti:field>
</activiti:executionListener>
</extensionElements>
</sequenceFlow>
但是,我需要对 https://google.com 进行 API 调用,仅用于测试目的。但是,当我尝试这样做时:
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1">
<extensionElements>
<activiti:executionListener event="start" class="org.alfresco.repo.workflow.activiti.listener.ScriptExecutionListener">
<activiti:field name="script">
<activiti:string>
var url = "https://google.com";
var xhr = new XMLHttpRequest();
xhr.open("GET",url);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
logger.log(xhr.status);
logger.log(xhr.responseText);
}};
xhr.send();
</activiti:string>
</activiti:field>
</activiti:executionListener>
</extensionElements>
</sequenceFlow>
我收到此异常:
org.alfresco.scripts.ScriptException: 01030043 Failed to execute supplied script: 01030042 ReferenceError: "XMLHttpRequest" is not defined. (AlfrescoJS#3)
at org.alfresco.repo.jscript.Rhinoscriptprocessor.executeString(Rhinoscriptprocessor.java:287)
at org.alfresco.repo.processor.ScriptServiceImpl.executeString(ScriptServiceImpl.java:293)
at org.alfresco.repo.processor.ScriptServiceImpl.executeScriptString(ScriptServiceImpl.java:200)
正在调查中,我查看了这篇文章:https://hub.alfresco.com/t5/alfresco-content-services-forum/calling-rest-service-via-rule-script/td-p/32830。 似乎(根据我的理解)我需要使用 Java 类进行 API 调用,然后以某种方式从 .bpmn 文件上的 js 调用该对象。所以:
- 能否请您告诉我必须在我的 Maven 项目中的何处创建此类?是包裹吗?你能告诉我如何创建它的确切步骤吗?
- 您能否在此处粘贴实现此类的确切代码?
- 你能告诉我如何从 .bpmn 文件中的 js 调用 java 对象吗?
重要提示:我需要以某种方式记录 API 调用响应。它可以是您想要的日志,但我需要知道 Google 是否会相应地回复我。
提前致谢!
解决方法
首先,您必须创建一个 alfresco maven project。然后,您必须按照 alfresco docs 创建一个 Java 支持的 web 脚本。
以下是 webscript desc.xml 的示例。
<webscript>
<shortname>BPM Review</shortname>
<description>Review and approve a BPM task</description>
<url>/someco/bpm/review?id={idArgument}&action={transArgument}</url>
<format default="html">extension</format>
<authentication runas="admin">guest</authentication>
<transaction>required</transaction>
</webscript>
// Dependencies
private WorkflowService workflowService;
@Override
protected Map<String,Object> executeImpl(WebScriptRequest req,Status status) {
final String id = req.getParameter("id");
final String action = req.getParameter("action");
if (id == null || action == null) {
logger.debug("Email,ID,action,or secret not set");
status.setCode(400);
status.setMessage("Required data has not been provided");
status.setRedirect(true);
}
Map<String,Object> model = new HashMap<String,Object>();
logger.debug("About to update task,id:" + id + " with outcome:" + action);
Map<QName,Serializable> props = new HashMap<QName,Serializable>();
props.put(QName.createQName(SomeCoWorkflowModel.NAMESPACE_SOMECO_WORKFLOW_CONTENT_MODEL,SomeCoWorkflowModel.PROP_APPROVE_REJECT_OUTCOME),action);
workflowService.updateTask(id,props,null,null);
workflowService.endTask(id,action);
logger.debug("Task updated and ended.");
return model;
}
然后你可以在任何地方调用 webscript 作为 Rest 调用,如下所示。
http://localhost:8080/alfresco/service/someco/bpm/review?id=activiti$