{"record":{"id":"b415c3607919ea15","repo":"flowable/flowable-engine","slug":"cannot-convert-event-payload-payloadinstancevalu","errorCode":null,"errorMessage":"Cannot convert event payload ${payloadInstanceValue} to type 'double'","messagePattern":"Cannot convert event payload (.+?) to type 'double'","errorType":"exception","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/serialization/EventPayloadToJsonStringSerializer.java","lineNumber":71,"sourceCode":"                continue;\n            }\n\n            String definitionType = payloadInstance.getDefinitionType();\n            Object payloadInstanceValue = payloadInstance.getValue();\n\n            if (payloadInstanceValue != null) {\n\n                if (EventPayloadTypes.STRING.equals(definitionType)) {\n                    objectNode.put(payloadInstance.getDefinitionName(), payloadInstanceValue.toString());\n\n                } else if (EventPayloadTypes.DOUBLE.equals(definitionType)) {\n\n                    if (payloadInstanceValue instanceof Number) {\n                        objectNode.put(payloadInstance.getDefinitionName(), ((Number) payloadInstanceValue).doubleValue());\n                    } else if (payloadInstanceValue instanceof String) {\n                        objectNode.put(payloadInstance.getDefinitionName(), Double.valueOf((String) payloadInstanceValue));\n                    } else {\n                        throw new FlowableIllegalArgumentException(\"Cannot convert event payload \" + payloadInstanceValue + \" to type 'double'\");\n                    }\n\n                } else if (EventPayloadTypes.INTEGER.equals(definitionType)) {\n\n                    if (payloadInstanceValue instanceof Number) {\n                        objectNode.put(payloadInstance.getDefinitionName(), ((Number) payloadInstanceValue).intValue());\n                    } else if (payloadInstanceValue instanceof String) {\n                        objectNode.put(payloadInstance.getDefinitionName(), Integer.valueOf((String) payloadInstanceValue));\n                    } else {\n                        throw new FlowableIllegalArgumentException(\"Cannot convert event payload \" + payloadInstanceValue + \" to type 'integer'\");\n                    }\n\n                } else if (EventPayloadTypes.LONG.equals(definitionType)) {\n\n                    if (payloadInstanceValue instanceof Number) {\n                        objectNode.put(payloadInstance.getDefinitionName(), ((Number) payloadInstanceValue).longValue());\n                    } else if (payloadInstanceValue instanceof String) {\n                        objectNode.put(payloadInstance.getDefinitionName(), Long.valueOf((String) payloadInstanceValue));","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/serialization/EventPayloadToJsonStringSerializer.java#L53-L89","documentation":"FlowableIllegalArgumentException thrown by EventPayloadToJsonStringSerializer.serialize when a payload instance declared as type 'double' is neither a Number nor a String, so it cannot be converted to a JSON double. This happens while serializing an event payload to JSON for transmission/storage.","triggerScenarios":"Event payload definition declares type 'double' but the payload instance value is an incompatible object (e.g. Boolean, Map, POJO, or null-valued wrapper) when the event is serialized.","commonSituations":"Event instance built programmatically with wrong value types; upstream producer sending strings/objects that bypass type coercion; refactored payload models changing a field's Java type.","solutions":["Set the payload value as a Double/Number (or numeric String) matching the declared 'double' payload type.","Correct the event payload definition if the value is legitimately non-numeric (change type to 'string' or 'json').","Validate/coerce payload values before calling the serializer / publishing the event."],"exampleFix":"// before\nEventPayloadInstance p = ...; // declared 'double'\np.setValue(\"value\", complexObject);\n// after\np.setValue(\"value\", Double.parseDouble(objectValue.toString()));","handlingStrategy":"type-guard","validationCode":"Object v = payloadValue; if (!(v instanceof Number) && !(v instanceof String)) { throw new IllegalArgumentException(\"payload 'double' value must be Number or numeric String\"); }","typeGuard":"boolean isDoubleCompatible(Object v) { return v instanceof Number || v instanceof String; }","tryCatchPattern":"try { serializer.serialize(eventInstance); } catch (FlowableIllegalArgumentException e) { LOG.error(\"payload type mismatch for double field: \" + e.getMessage()); throw e; }","preventionTips":["Match Java value types to declared payload types when building event instances","Coerce numeric values to Double before publishing","Keep payload definitions and producers in sync via schema tests"],"tags":["flowable","serialization","type-mismatch","event-payload"],"backgroundTag":"type-mismatch","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}