{"record":{"id":"da1d4a933a19e121","repo":"alibaba/DataX","slug":"transformer-illegal-parameter-da1d4a","errorCode":"TRANSFORMER_ILLEGAL_PARAMETER","errorMessage":"dx_substr paras must be 3","messagePattern":"dx_substr paras must be 3","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/com/alibaba/datax/core/transport/transformer/SubstrTransformer.java","lineNumber":29,"sourceCode":"/**\n * no comments.\n * Created by liqiang on 16/3/4.\n */\npublic class SubstrTransformer extends Transformer {\n    public SubstrTransformer() {\n        setTransformerName(\"dx_substr\");\n    }\n\n    @Override\n    public Record evaluate(Record record, Object... paras) {\n\n        int columnIndex;\n        int startIndex;\n        int length;\n\n        try {\n            if (paras.length != 3) {\n                throw new RuntimeException(\"dx_substr paras must be 3\");\n            }\n\n            columnIndex = (Integer) paras[0];\n            startIndex = Integer.valueOf((String) paras[1]);\n            length = Integer.valueOf((String) paras[2]);\n\n        } catch (Exception e) {\n            throw DataXException.asDataXException(TransformerErrorCode.TRANSFORMER_ILLEGAL_PARAMETER, \"paras:\" + Arrays.asList(paras).toString() + \" => \" + e.getMessage());\n        }\n\n        Column column = record.getColumn(columnIndex);\n\n        try {\n            String oriValue = column.asString();\n            //如果字段为空，跳过subStr处理\n            if(oriValue == null){\n                return record;\n            }","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/alibaba/DataX/blob/80ec23d5c5328eb90ca364d2749e92dfaf44541e/core/src/main/java/com/alibaba/datax/core/transport/transformer/SubstrTransformer.java#L11-L47","documentation":"Thrown by the dx_substr transformer when its paras array does not contain exactly 3 elements. dx_substr expects [columnIndex(int), startIndex(String), length(String)]. The length check runs first in the parameter-parsing try block and is reported as TRANSFORMER_ILLEGAL_PARAMETER together with the parsed paras list.","triggerScenarios":"A job JSON declares dx_substr with 2 or 4 parameters, e.g. \"paras\": [0, \"1\"] (missing length) or [0, \"1\", \"4\", \"extra\"]. Any deviation from 3 elements throws before any record is processed.","commonSituations":"Assuming substring-to-end needs no length argument, copying the 4-element dx_replace parameter shape, or a malformed JSON array that yields a different element count.","solutions":["Provide exactly 3 parameters: column index (int), startIndex (numeric string), length (numeric string).","To take the rest of the string, pass a large length (e.g. \"999999\") — the code clamps to the string end when startIndex+length >= value length.","Use the 'paras:[...]' echo in the error message to confirm what DataX actually parsed."],"exampleFix":"// before\n\"paras\": [2, \"1\"]\n// after\n\"paras\": [2, \"1\", \"999999\"]","handlingStrategy":"validation","validationCode":"Object[] paras = ...;\nif (paras.length != 3) throw new IllegalArgumentException(\"dx_substr needs [columnIndex, startIndex, length]\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remember dx_substr takes a length; for 'rest of string' pass a large length constant.","Preflight all transformer arities in CI with a job JSON schema check."],"tags":["datax","transformer","dx-substr","configuration"],"backgroundTag":null,"analyzedSha":"80ec23d5c5328eb90ca364d2749e92dfaf44541e","analyzedAt":"2026-08-14T15:33:51.187Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}