{"record":{"id":"34e3fee4290f8426","repo":"mybatis/mybatis-3","slug":"error-resolving-parametermode-cause-cause","errorCode":null,"errorMessage":"Error resolving ParameterMode. Cause: {cause}","messagePattern":"Error resolving ParameterMode\\. Cause: (.+?)","errorType":"exception","errorClass":"BuilderException","httpStatus":null,"severity":"error","filePath":"src/main/java/org/apache/ibatis/builder/BaseBuilder.java","lineNumber":87,"sourceCode":"      return alias == null ? null : JdbcType.valueOf(alias);\n    } catch (IllegalArgumentException e) {\n      throw new BuilderException(\"Error resolving JdbcType. Cause: \" + e, e);\n    }\n  }\n\n  protected ResultSetType resolveResultSetType(String alias) {\n    try {\n      return alias == null ? null : ResultSetType.valueOf(alias);\n    } catch (IllegalArgumentException e) {\n      throw new BuilderException(\"Error resolving ResultSetType. Cause: \" + e, e);\n    }\n  }\n\n  protected ParameterMode resolveParameterMode(String alias) {\n    try {\n      return alias == null ? null : ParameterMode.valueOf(alias);\n    } catch (IllegalArgumentException e) {\n      throw new BuilderException(\"Error resolving ParameterMode. Cause: \" + e, e);\n    }\n  }\n\n  protected Object createInstance(String alias) {\n    Class<?> clazz = resolveClass(alias);\n    try {\n      return clazz == null ? null : clazz.getDeclaredConstructor().newInstance();\n    } catch (Exception e) {\n      throw new BuilderException(\"Error creating instance. Cause: \" + e, e);\n    }\n  }\n\n  protected <T> Class<? extends T> resolveClass(String alias) {\n    try {\n      return alias == null ? null : resolveAlias(alias);\n    } catch (Exception e) {\n      throw new BuilderException(\"Error resolving class. Cause: \" + e, e);\n    }","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/mybatis/mybatis-3/blob/008069adb1b089579b5dcba87ee591908b263274/src/main/java/org/apache/ibatis/builder/BaseBuilder.java#L69-L105","documentation":"BaseBuilder.resolveParameterMode() converts the parameterMode attribute of <parameter> elements into the ParameterMode enum (IN, OUT, INOUT) via valueOf(). Any value outside those three constants fails parsing with this BuilderException.","triggerScenarios":"parameterMode=\"IN_OUT\" (underscore typo; correct is INOUT); parameterMode=\"RETURN\" on legacy stored-proc parameter maps; lowercase 'in'.","commonSituations":"Writing stored-procedure <parameterMap> entries by hand; migrating old iBATIS parameter maps with informal mode names.","solutions":["Use exactly IN, OUT, or INOUT as the parameterMode value","For stored function return values, use the standard #{result, mode=OUT, jdbcType=...} pattern or a result map rather than inventing a mode"],"exampleFix":"<!-- before -->\n<parameter property=\"total\" parameterMode=\"IN_OUT\"/>\n<!-- after -->\n<parameter property=\"total\" parameterMode=\"INOUT\"/>","handlingStrategy":"validation","validationCode":"static final Set<String> VALID = Set.of(\"IN\", \"OUT\", \"INOUT\");\nif (!VALID.contains(mode)) throw new IllegalArgumentException(mode);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use exactly IN, OUT, INOUT in parameterMode attributes","Consider the modern inline #{param, mode=OUT, jdbcType=...} syntax over legacy <parameterMap>"],"tags":["mybatis","builder","parameter-mode","stored-procedure"],"backgroundTag":null,"analyzedSha":"008069adb1b089579b5dcba87ee591908b263274","analyzedAt":"2026-08-14T13:07:10.264Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}