首先,我要感谢每个花时间帮助我解决问题的人,因为我正在寻找一个多星期来解决我的问题。这里是:如何仅使用Java更新露天工作流任务中的自定义属性?
我的目标是在Alfresco Community 5.2中启动自定义工作流程,并通过仅使用公共Java API的Web脚本在第一个任务中设置一些自定义属性。我的课正在扩展AbstractWebScript。目前,我已经成功启动了工作流和设置属性,如bpm:workflowDescription,但我无法在任务中设置自定义属性。
下面是代码:
public class StartWorkflow extends AbstractWebScript {
/**
* The Alfresco Service Registry that gives access to all public content services in Alfresco.
*/
private ServiceRegistry serviceRegistry;
public void setServiceRegistry(ServiceRegistry serviceRegistry) {
this.serviceRegistry = serviceRegistry;
}
@Override
public void execute(WebScriptRequest req, WebScriptResponse res) throws IOException {
// Create JSON object for the response
JSONObject obj = new JSONObject();
try {
// Check if parameter defName is present in the request
String wfDefFromReq = req.getParameter("defName");
if (wfDefFromReq == null) {
obj.put("resultCode", "1 (Error)");
obj.put("errorMessage", "Parameter defName not found.");
return;
}
// Get the WFL Service
WorkflowService workflowService = serviceRegistry.getWorkflowService();
// Build WFL Definition name
String wfDefName = "activiti$" + wfDefFromReq;
// Get WorkflowDefinition object
WorkflowDefinition wfDef = workflowService.getDefinitionByName(wfDefName);
// Check if such WorkflowDefinition exists
if (wfDef == null) {
obj.put("resultCode", "1 (Error)");
obj.put("errorMessage", "No workflow definition found for defName = " + wfDefName);
return;
}
// Get parameters from the request
Content reqContent = req.getContent();
if (reqContent == null) {
throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Missing request body.");
}
String content;
content = reqContent.getContent();
if (content.isEmpty()) {
throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Content is empty");
}
JSONTokener jsonTokener = new JSONTokener(content);
JSONObject json = new JSONObject(jsonTokener);
// Set the workflow description
Map<QName, Serializable> params = new HashMap();
params.put(WorkflowModel.PROP_WORKFLOW_DESCRIPTION, "Workflow started from JAVA API");
// Start the workflow
WorkflowPath wfPath = workflowService.startWorkflow(wfDef.getId(), params);
// Get params from the POST request
Map<QName, Serializable> reqParams = new HashMap();
Iterator<String> i = json.keys();
while (i.hasNext()) {
String paramName = i.next();
QName qName = QName.createQName(paramName);
String value = json.getString(qName.getLocalName());
reqParams.put(qName, value);
}
// Try to update the task properties
// Get the next active task which contains the properties to update
WorkflowTask wfTask = workflowService.getTasksForWorkflowPath(wfPath.getId()).get(0);
// Update properties
WorkflowTask updatedTask = workflowService.updateTask(wfTask.getId(), reqParams, null, null);
obj.put("resultCode", "0 (Success)");
obj.put("workflowId", wfPath.getId());
} catch (JSONException e) {
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
e.getLocalizedMessage());
} catch (IOException ioe) {
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
"Error when parsing the request.",
ioe);
} finally {
// build a JSON string and send it back
String jsonString = obj.toString();
res.getWriter().write(jsonString);
}
}
}
这里是我所说的webscript:
curl -v -uadmin:admin -X POST -d @postParams.json localhost:8080/alfresco/s/workflow/startJava?defName=nameOfTheWFLDefinition -H "Content-Type:application/json"
在postParams.json文件我有一个属性/值所需要的对,我需要更新:
{
"cmprop:propOne" : "Value 1",
"cmprop:propTwo" : "Value 2",
"cmprop:propThree" : "Value 3"
}
工作流已启动,bpm:workflowDescription设置正确,但任务中的属性不可见,无法设置。
我做了一个JS脚本,我打电话的时候,工作流开始:
execution.setVariable('bpm_workflowDescription', 'Some String ' + execution.getVariable('cmprop:propOne'));
而实际上对于cmprop值:propOne的使用量和描述是正确更新 - 这意味着,这些属性将某个更新(在执行级别可能?),但我不明白为什么他们不可见时,我打开任务。
我有开始工作流程和更新使用JavaScript API与性能的成功:
if (wfdef) {
// Get the params
wfparams = {};
if (jsonRequest) {
for (var prop in jsonRequest) {
wfparams[prop] = jsonRequest[prop];
}
}
wfpackage = workflow.createPackage();
wfpath = wfdef.startWorkflow(wfpackage, wfparams);
的问题是,我只希望使用公共的Java API,请帮助。 谢谢!
我已经试过: '如果(!typeof运算cmprop_propOne = '未定义')task.setVariableLocal( 'cmprop_propOne',execution.getVariable( 'cmprop_propOne') );'但仍然没有成功。我错过了什么? – tmacftw
我试图使用task.setVariable和task.setVariableLocal都没有成功。看起来出于某种原因,在使用javascript时,所有属性在执行和任务级别都可见,但是当我使用Java API时,属性仅在执行级别上可见:另外,'workflowService.updateTask(wfTask.getId(),reqParams,null,null);'出于某种原因也不会使这些属性可见。 – tmacftw