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

  1. Inspect the task definition's inputTemplate in the workflow definition JSON for circular references or unsupported nested types.
  2. Simplify the inputTemplate to use only plain JSON-compatible types (String, Number, Boolean, Map, List).
  3. If custom types are needed in templates, register the appropriate Jackson serializers/deserializers.
  4. 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

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


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/7b70ccd6b2bc50cb. Report an issue: GitHub.