a REST GET is invoked that returns
[{“id”:1,“name”:“Item1”,“isComplete”:false},{“id”:2,“name”:“Item2”,“isComplete”:true},{“id”:3,“name”:“Item3”,“isComplete”:true}]
The BDM setup to consume this is defined as
ToDoItem
Id: Integer
Name: String
IsComplete: Boolean
A pool variable (varToDoItems) is created based on this, and is set to be a List (ie checkbox on Is Multiple)
I then mapped varToDoItems (left hand operand) to “takes value of” bodyAsObject (right hand operand).
The engine log then shows this error -
java.lang.ClassCastException : “java.util.LinkedHashMap cannot be cast to org.bonitasoft.engine.bdm.Entity”
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.bonitasoft.engine.bdm.Entity
at org.bonitasoft.engine.operation.MergeEntityAction.execute(MergeEntityAction.java:50)
at org.bonitasoft.engine.operation.EntitiesActionsExecutor.executeAction(EntitiesActionsExecutor.java:45)
at org.bonitasoft.engine.operation.BusinessDataAssignmentStrategy.computeNewValueForLeftOperand(BusinessDataAssignmentStrategy.java:45)
at org.bonitasoft.engine.core.operation.impl.OperationServiceImpl.calculateRightOperandValue(OperationServiceImpl.java:124)
Would appreciate help~
Pierre Yves Monnet kindly provided the answers -
- change the declaration from def to the correct data type
- fix the bug of result.add(keyValuePair) to result.add(ob)
the complete script →
import com.company.model.ToDoItem
List result = new ArrayList()
if (bodyAsObject)
{
for (keyValuePair in bodyAsObject)
{
ToDoItem obj = new ToDoItem()
obj.Id = keyValuePair[‘Id’]
obj.Name = keyValuePair[‘Name’]
obj.IsComplete = keyValuePair[‘IsComplete’]
result.add(obj)
}
}
result
Didn’t want to change the previous line because it contained a couple of other errors (ie key names are camelCase so I was getting nulls)
Here’s the updated one using bodyAsObject
import com.company.model.ToDoItem
File outputFile = new File(“C:/LocalData/Temp/BonitaTestOnRestGet.txt”)
outputFile.write(“Begin output\n\n”)
// List result = new ArrayList()
List result = new ArrayList()
if (bodyAsObject)
{
outputFile.append(bodyAsObject.toString() + “\n\n”)
for (keyValuePair in bodyAsObject)
{
ToDoItem obj = new ToDoItem()
obj.Id = keyValuePair[‘id’]
obj.Name = keyValuePair[‘name’]
obj.IsComplete = keyValuePair[‘isComplete’]
outputFile.append(‘obj\n’
+ obj.getId().toString()
+ obj.getName()
+ obj.isIsComplete().toString() + “\n\n”)
result.add(obj)
}
}
else
{
outputFile.write(“empty bodyAsString\n\n”)
}
return result
There isn’t a lot of info that I see with regards to consuming a json string - so I’m including this version using bodyAsString as well
import com.company.model.ToDoItem
import groovy.json.JsonSlurper
File outputFile = new File(“C:/LocalData/Temp/BonitaTestOnRestGet.txt”)
outputFile.write(“Begin output\n\n”)
JsonSlurper slurper = new JsonSlurper()
List result = new ArrayList()
if (bodyAsString)
{
outputFile.append(bodyAsString + “\n\n”)
result = slurper.parseText(bodyAsString)
outputFile.append("result as string : " + result.toString() + “\n\n”)
for (keyValuePair in result)
{
ToDoItem obj = new ToDoItem()
obj.Id = keyValuePair[‘id’]
obj.Name = keyValuePair[‘name’]
obj.IsComplete = keyValuePair[‘isComplete’]
outputFile.append(‘obj\n’
+ obj.getId().toString()
+ obj.getName()
+ obj.isIsComplete().toString() + “\n\n”)
}
}
else
{
outputFile.write(“empty bodyAsString\n\n”)
}
return result