Hi .It seems my question to be duplicate but I couldn’t infer the answer.
I had read an array of object by inline groovy script and sat my variable like this :
import groovy.sql.Sql
import java.util.logging.Logger;
import org.camunda.bpm.engine.variable.Variables;
import org.camunda.bpm.engine.variable.value.ObjectValue;
Logger LOGGER = Logger.getLogger("personnel");
def dbPwkaraURL="jdbc:sqlserver://192.168.1.199:1433;databaseName=CamundaPersonel"
def dbPwkaraUser="sa"
def dbPwkaraPass="abc405060!"
def dbDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
def db = Sql.newInstance(dbPwkaraURL,dbPwkaraUser,dbPwkaraPass,dbDriver)
//def rows = db.rows('select family,secNo from personnel where perId='+"$perID")
def rows = db.rows('select * from personnel');
ObjectValue serializedList = Variables.objectValue(rows)
.serializationDataFormat(Variables.SerializationDataFormats.JSON)
.create();
execution.setVariable("test1", serializedList);
After that I need to retrieve the “test1” variable and apply some operations . on
execution.getVariable("test1")
command I face this error message :
Caused by: org.camunda.spin.json.SpinJsonDataFormatException: SPIN/JACKSON-JSON-01007 Cannot construct java type from string 'java.util.ArrayList<groovy.sql.GroovyRowResult<java.lang.Object,java.lang.Object>>'
at org.camunda.spin.impl.json.jackson.JacksonJsonLogger.unableToConstructJavaType(JacksonJsonLogger.java:76)
at org.camunda.spin.impl.json.jackson.format.JacksonJsonDataFormat.constructJavaTypeFromCanonicalString(JacksonJsonDataFormat.java:167)
at org.camunda.spin.impl.json.jackson.format.JacksonJsonDataFormatMapper.mapInternalToJava(JacksonJsonDataFormatMapper.java:83)
at org.camunda.spin.plugin.impl.SpinObjectValueSerializer.deserializeFromByteArray(SpinObjectValueSerializer.java:101)
at org.camunda.bpm.engine.impl.variable.serializer.AbstractObjectValueSerializer.deserializeFromByteArray(AbstractObjectValueSerializer.java:119)
at org.camunda.bpm.engine.impl.variable.serializer.AbstractSerializableValueSerializer.readValue(AbstractSerializableValueSerializer.java:83)
... 228 more
Caused by: java.lang.IllegalArgumentException: Cannot create TypeBindings for class groovy.sql.GroovyRowResult with 2 type parameters: class expects 0
at spinjar.com.fasterxml.jackson.databind.type.TypeBindings.create(TypeBindings.java:139)
at spinjar.com.fasterxml.jackson.databind.type.TypeBindings.create(TypeBindings.java:98)
at spinjar.com.fasterxml.jackson.databind.type.TypeBindings.create(TypeBindings.java:87)
at spinjar.com.fasterxml.jackson.databind.type.TypeParser.parseType(TypeParser.java:54)
at spinjar.com.fasterxml.jackson.databind.type.TypeParser.parseTypes(TypeParser.java:68)
at spinjar.com.fasterxml.jackson.databind.type.TypeParser.parseType(TypeParser.java:53)
at spinjar.com.fasterxml.jackson.databind.type.TypeParser.parse(TypeParser.java:33)
at spinjar.com.fasterxml.jackson.databind.type.TypeFactory.constructFromCanonical(TypeFactory.java:582)
at org.camunda.spin.impl.json.jackson.format.JacksonJsonDataFormat.constructJavaTypeFromCanonicalString(JacksonJsonDataFormat.java:165)
... 232 more
1 Like
You have set the serialization format to SerializationDataFormats.JSON
, but rows
is not actually serialized. To serialize the rows
try like this:
import groovy.json.JsonOutput
//other implementations
def rows = db.rows('select * from personnel');
String serializedRows = JsonOutput.toJson(rows);
ObjectValue serializedList = Variables.objectValue(serializedRows)
.serializationDataFormat(Variables.SerializationDataFormats.JSON)
.create();
execution.setVariable("test1", serializedList);
Hi @aravindhrs thanks for your attention.
I must say I have no problem in serialization. actually the error occurs in deserialization .
Any way I’ve added your code in setting variable but now its throwing new exception
> Unable to evaluate script while executing activity 'FillForm' in the process definition with id 'WH_Sample:9:eb480054-9b4e-11ea-bea6-003048b2ff0b': java.lang.StringIndexOutOfBoundsException: begin 1, end 2, length 1
@Ali_Titan if you are using that variable, then it should be deserialized and assign it to the variable before use.
After serialization how does the data looks like?
1 Like
@aravindhrs let me describe it from the beginning
In the process start script. I fetch some data as an array and serialize the table data to JSON format like you see with no problem . then I will need this data in the next user task which I should show this data to user so I set table data (table data) as test1 variable. in the task form I have it as json object in javascript and no problem.But in the next task which I want to access this ‘test1’ variable the deserialization error occurs .
You said that I must serialize the rows first but I don’t think so or may be didn’t understand you.
Variable status in cockpit

my bpmn file :
WareHouseSample (1).bpmn (7.5 KB)
@Ali_Titan, you’re directly storing the db resultSet object. This is not correct approach I believe. This will lead to deserialization issues. Populate the values in pojo and serialize the pojo to persist. For deserialization make sure that same pojo exists in camunda server classpath.
@aravindhrs
Hi again
I’ve switched from groovy script to Java class . I use a POJO class to persist as you said .
but then again I have deserialization error. you’ve mentioned than to be sure same POJO must be existed in camunda server classpath. I didn’t get that to what to do.
error shows up in cockpit :
Cannot deserialize object in variable 'test1': SPIN/JACKSON-JSON-01007 Cannot construct java type from string 'java.util.LinkedList<com.camunda.demo.test.PersonnelModel>'
@Ali_Titan For deserialization, you should have the below class in camunda classpath.
com.camunda.demo.test.PersonnelModel
Serialization:
ObjectValue typedObjectValue = Variables
.objectValue(order)
.serializationDataFormat(Variables.SerializationDataFormats.JAVA)
.create();
Access serialized properties:
// returns true
boolean isDeserialized = retrievedTypedObjectValue.isDeserialized();
// returns the format used by the engine to serialize the value into the database
String serializationDataFormat = retrievedTypedObjectValue.getSerializationDateFormat();
// returns the serialized representation of the variable; the actual value depends on the serialization format used
String serializedValue = retrievedTypedObjectValue.getValueSerialized();
// returns the class com.example.Order
Class<com.example.Order> valueClass = retrievedTypedObjectValue.getObjectType();
// returns the String "com.example.Order"
String valueClassName = retrievedTypedObjectValue.getObjectTypeName();
Deserialization:
String serializedOrder = "...";
ObjectValue serializedValue =
Variables
.serializedObjectValue(serializedOrder)
.serializationDataFormat(Variables.SerializationDataFormats.JAVA)
.objectTypeName("com.example.Order")
.create();
runtimeService.setVariableLocal(execution.getId(), "order", serializedValue);
ObjectValue retrievedTypedObjectValue = runtimeService.getVariableTyped(execution.getId(), "order");
com.example.Order retrievedOrder = (com.example.Order) retrievedTypedObjectValue.getValue();
Read about Serializing Process Variables
Custom Java objects can be serialized with the value type object:
https://docs.camunda.org/manual/latest/user-guide/process-engine/variables/#object-values
Object Value Serialization:
https://docs.camunda.org/manual/latest/user-guide/process-engine/variables/#object-value-serialization