conductor-oss/conductor · error · RuntimeException
Unable to clone input params
Error message
Unable to clone input params
What it means
Thrown by ParametersUtils.clone when Jackson ObjectMapper fails to deep-clone a task's input template via JSON round-trip (writeValueAsBytes then readValue). The clone is used to prevent shared mutable references between task instances. An IOException during this process wraps in a generic RuntimeException, indicating the input template contains data that cannot be serialized/deserialized.
Source
Thrown at core/src/main/java/com/netflix/conductor/core/utils/ParametersUtils.java:185
DocumentContext documentContext = JsonPath.parse(inputMap, option);
Map<String, Object> replacedTaskInput = replace(inputParams, documentContext, taskId);
if (taskDefinition != null && taskDefinition.getInputTemplate() != null) {
// If input for a given key resolves to null, try replacing it with one from
// inputTemplate, if it exists.
replacedTaskInput.replaceAll(
(key, value) ->
(value == null) ? taskDefinition.getInputTemplate().get(key) : value);
}
return replacedTaskInput;
}
// deep clone using json - POJO
private Map<String, Object> clone(Map<String, Object> inputTemplate) {
try {
byte[] bytes = objectMapper.writeValueAsBytes(inputTemplate);
return objectMapper.readValue(bytes, map);
} catch (IOException e) {
throw new RuntimeException("Unable to clone input params", e);
}
}
public Map<String, Object> replace(Map<String, Object> input, Object json) {
Object doc;
if (json instanceof String) {
doc = JsonPath.parse(json.toString());
} else {
doc = json;
}
Configuration option =
Configuration.defaultConfiguration().addOptions(Option.SUPPRESS_EXCEPTIONS);
DocumentContext documentContext = JsonPath.parse(doc, option);
return replace(input, documentContext, null);
}
public Object replace(String paramString) {
Configuration option =View on GitHub (pinned to cf7c3e4a8a)
Solutions
- Inspect the task definition's inputTemplate in the workflow definition JSON for circular references or unsupported nested types.
- Simplify the inputTemplate to use only plain JSON-compatible types (String, Number, Boolean, Map, List).
- If custom types are needed in templates, register the appropriate Jackson serializers/deserializers.
- Check the server log for the underlying IOException cause to identify which field triggers the failure.
Defensive patterns
Strategy: validation
Validate before calling
// Validate input template is JSON-serializable before workflow registration
try {
byte[] bytes = objectMapper.writeValueAsBytes(workflowTask.getInputTemplate());
objectMapper.readValue(bytes, Map.class);
} catch (IOException e) {
throw new IllegalArgumentException(
"Input template for task '" + workflowTask.getName() + "' is not serializable", e);
} Prevention
- Use only plain JSON types (Map, List, String, Number, Boolean) in input templates.
- Avoid circular or deeply nested structures in task input templates.
- Test workflow definitions with representative data in integration tests.
When it happens
Trigger: A task definition's inputTemplate or the task's resolved input parameters contain objects that Jackson cannot serialize to bytes or deserialize back — e.g. self-referencing objects, types without default constructors, or incompatible nested structures that survive the template merge but break during cloning.
Common situations: A workflow definition's inputTemplate contains a deeply nested or circular structure. A ${...} expression resolves to an object type that the ObjectMapper doesn't know how to handle. Custom Jackson modules are misconfigured or missing. Very large templates that hit serialization limits.
Related errors
- PLAN_EXECUTE '${config.getName()}': tool '${t.getName()}' fa
- Error parsing the json schema : {message}
- Error reading workflow: %s
- Workflow can not be serialized to json
- Task %s of workflow %s can not be serialized to json
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/7b70ccd6b2bc50cb.
Report an issue: GitHub.