{"record":{"id":"46a1abc75e48db0f","repo":"alibaba/COLA","slug":"unexpected-value-value","errorCode":null,"errorMessage":"Unexpected value '${value}'","messagePattern":"Unexpected value '(.+?)'","errorType":"exception","errorClass":"JobException","httpStatus":null,"severity":"error","filePath":"cola-components/cola-component-job/src/main/java/com/alibaba/cola/job/model/ExecutionStatus.java","lineNumber":29,"sourceCode":"    COMPLETED,\n    FAILED,\n    RUNNING,\n    ROLLBACK_STARTED,\n    ROLLBACK_COMPLETED,\n    ROLLBACK_FAILED,\n    UNKNOWN;\n\n    public final static List<ExecutionStatus> ROLLBACK_STATUS = List.of(ROLLBACK_STARTED, ROLLBACK_FAILED,\n            ROLLBACK_COMPLETED);\n\n    @JsonCreator\n    public static ExecutionStatus fromValue(String value) {\n        for (ExecutionStatus s : ExecutionStatus.values()) {\n            if (s.name().equals(value)) {\n                return s;\n            }\n        }\n        throw new JobException(\"Unexpected value '\" + value + \"'\");\n    }\n\n    public static boolean isRollback(ExecutionStatus executionStatus) {\n        return executionStatus != null && ROLLBACK_STATUS.contains(executionStatus);\n    }\n\n    public static boolean isTerminated(ExecutionStatus executionStatus) {\n        return executionStatus == ExecutionStatus.COMPLETED\n                || executionStatus == ExecutionStatus.FAILED\n                || isRollback(executionStatus);\n    }\n}\n\n","sourceCodeStart":11,"sourceCodeEnd":43,"githubUrl":"https://github.com/alibaba/COLA/blob/352e1a867538d9cd40e1b11e4028fa652fc97557/cola-components/cola-component-job/src/main/java/com/alibaba/cola/job/model/ExecutionStatus.java#L11-L43","documentation":"ExecutionStatus.fromValue(String) iterates all enum constants and throws JobException 'Unexpected value' when no constant name equals the input. It is a strict string-to-enum converter for persisted execution status values.","triggerScenarios":"Calling ExecutionStatus.fromValue with a string that is not the exact name() of an enum constant (case-sensitive, no trimming).","commonSituations":"Loading status values persisted by an older version whose enum names changed; passing lowercase 'running' instead of 'RUNNING'; whitespace from DB columns or message payloads.","solutions":["Pass the exact enum constant name, e.g. ExecutionStatus.RUNNING.name()","Trim and uppercase the incoming string before conversion","Migrate legacy persisted values to current enum names, or add legacy constants"],"exampleFix":"// before\nExecutionStatus s = ExecutionStatus.fromValue(status.trim().toLowerCase());\n// after\nExecutionStatus s = ExecutionStatus.fromValue(status.trim().toUpperCase());","handlingStrategy":"validation","validationCode":"String v = raw == null ? null : raw.trim();\nboolean known = Arrays.stream(ExecutionStatus.values()).anyMatch(s -> s.name().equals(v));\nif (!known) throw new IllegalStateException(\"Unknown ExecutionStatus: \" + raw);","typeGuard":"java.util.Optional<ExecutionStatus> tryFromValue(String value) {\n    if (value == null) return Optional.empty();\n    return Arrays.stream(ExecutionStatus.values())\n        .filter(s -> s.name().equals(value.trim()))\n        .findFirst();\n}","tryCatchPattern":"try {\n    status = ExecutionStatus.fromValue(raw);\n} catch (JobException e) {\n    if (e.getMessage().startsWith(\"Unexpected value\")) {\n        log.error(\"Persisted status '{}' is not a valid ExecutionStatus\", raw, e);\n        status = ExecutionStatus.FAILED; // or rethrow per policy\n    } else throw e;\n}","preventionTips":["Store status.name() so round-trips are lossless","Trim/normalize strings coming from DB or messages","Keep enum names backward-compatible when refactoring persisted states"],"tags":["java","enum","parsing"],"backgroundTag":"invalid-enum-value","analyzedSha":"352e1a867538d9cd40e1b11e4028fa652fc97557","analyzedAt":"2026-09-08T00:46:23.972Z","contentChangedAt":"2026-09-08T00:46:23.972Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}