{"record":{"id":"97139a1d4a1fc20d","repo":"apache/incubator-seata","slug":"unknown-branchtype-name-97139a","errorCode":null,"errorMessage":"Unknown BranchType[{name}]","messagePattern":"Unknown BranchType\\[(.+?)\\]","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/apache/seata/core/model/BranchType.java","lineNumber":88,"sourceCode":"                return branchType;\n            }\n        }\n        throw new IllegalArgumentException(\"Unknown BranchType[\" + ordinal + \"]\");\n    }\n\n    /**\n     * Get branch type.\n     *\n     * @param name the name\n     * @return the branch type\n     */\n    public static BranchType get(String name) {\n        for (BranchType branchType : values()) {\n            if (branchType.name().equalsIgnoreCase(name)) {\n                return branchType;\n            }\n        }\n        throw new IllegalArgumentException(\"Unknown BranchType[\" + name + \"]\");\n    }\n}\n","sourceCodeStart":70,"sourceCodeEnd":91,"githubUrl":"https://github.com/apache/incubator-seata/blob/e01f97c6db397165050caa6764020410c2c8199a/core/src/main/java/org/apache/seata/core/model/BranchType.java#L70-L91","documentation":"BranchType.get(String) resolves a branch type by name, case-insensitively, over the enum {AT, XA, TCC, SAGA}. It throws IllegalArgumentException when the string is not one of these — a config or annotation value misspelling.","triggerScenarios":"Configuring branch type by string with a typo or unsupported alias: 'tcc ' trailing space, 'At' works but 'AT_MODE', 'at-mode', 'saga' on a very old build without SAGA, or 'xa-mode' style values from other frameworks.","commonSituations":"YAML/properties copy-paste errors, values borrowed from non-Seata transaction frameworks, or reflective code passing annotation attributes straight through without validation.","solutions":["Use exact names: at, xa, tcc, saga (any case) with no surrounding whitespace in the config value.","Validate user/externally supplied branch-type strings against the known set before passing them to BranchType.get.","Trim strings and reject unknown values early at config load with a clear message."],"exampleFix":"# before\nseata.data-source-proxy.branch-type=AT_MODE\n# after\nseata.data-source-proxy.branch-type=AT","handlingStrategy":"validation","validationCode":"static final Set<String> BRANCH_NAMES =\n    Arrays.stream(BranchType.values()).map(b -> b.name().toLowerCase()).collect(Collectors.toSet());\nboolean ok = BRANCH_NAMES.contains(cfgValue.trim().toLowerCase());","typeGuard":"static Optional<BranchType> parseBranch(String s) {\n    String n = s == null ? \"\" : s.trim();\n    return Arrays.stream(BranchType.values()).filter(b -> b.name().equalsIgnoreCase(n)).findFirst();\n}","tryCatchPattern":null,"preventionTips":["Trim and lowercase-normalize branch-type config before use","Offer only at/xa/tcc/saga in config tooling"],"tags":["config","enum","branch-type","typo"],"backgroundTag":null,"analyzedSha":"e01f97c6db397165050caa6764020410c2c8199a","analyzedAt":"2026-08-14T10:23:53.097Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}