mybatis/mybatis-3 · error · BuilderException
Error resolving ParameterMode. Cause: {cause}
Error message
Error resolving ParameterMode. Cause: {cause} What it means
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.
Source
Thrown at src/main/java/org/apache/ibatis/builder/BaseBuilder.java:87
return alias == null ? null : JdbcType.valueOf(alias);
} catch (IllegalArgumentException e) {
throw new BuilderException("Error resolving JdbcType. Cause: " + e, e);
}
}
protected ResultSetType resolveResultSetType(String alias) {
try {
return alias == null ? null : ResultSetType.valueOf(alias);
} catch (IllegalArgumentException e) {
throw new BuilderException("Error resolving ResultSetType. Cause: " + e, e);
}
}
protected ParameterMode resolveParameterMode(String alias) {
try {
return alias == null ? null : ParameterMode.valueOf(alias);
} catch (IllegalArgumentException e) {
throw new BuilderException("Error resolving ParameterMode. Cause: " + e, e);
}
}
protected Object createInstance(String alias) {
Class<?> clazz = resolveClass(alias);
try {
return clazz == null ? null : clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new BuilderException("Error creating instance. Cause: " + e, e);
}
}
protected <T> Class<? extends T> resolveClass(String alias) {
try {
return alias == null ? null : resolveAlias(alias);
} catch (Exception e) {
throw new BuilderException("Error resolving class. Cause: " + e, e);
}View on GitHub (pinned to 008069adb1)
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
Example fix
<!-- before --> <parameter property="total" parameterMode="IN_OUT"/> <!-- after --> <parameter property="total" parameterMode="INOUT"/>
Defensive patterns
Strategy: validation
Validate before calling
static final Set<String> VALID = Set.of("IN", "OUT", "INOUT");
if (!VALID.contains(mode)) throw new IllegalArgumentException(mode); Prevention
- Use exactly IN, OUT, INOUT in parameterMode attributes
- Consider the modern inline #{param, mode=OUT, jdbcType=...} syntax over legacy <parameterMap>
When it happens
Trigger: parameterMode="IN_OUT" (underscore typo; correct is INOUT); parameterMode="RETURN" on legacy stored-proc parameter maps; lowercase 'in'.
Common situations: Writing stored-procedure <parameterMap> entries by hand; migrating old iBATIS parameter maps with informal mode names.
Related errors
- Error resolving JdbcType. Cause: {cause}
- Error resolving ResultSetType. Cause: {cause}
- Error creating instance. Cause: {cause}
- Error resolving class. Cause: {cause}
- Type {typeHandlerType} is not a valid TypeHandler because it
AI-assisted analysis of mybatis/mybatis-3@008069adb1 (2026-08-14).
Data as JSON: /api/errors/34e3fee4290f8426.
Report an issue: GitHub.