mybatis/mybatis-3 · error · IllegalArgumentException

does not represent an enum type.

Error message

{} does not represent an enum type.

What it means

EnumOrdinalTypeHandler validates that the Class passed to its constructor is really an enum by calling type.getEnumConstants(); a null return means the class is not an enum type, and the handler aborts with this IllegalArgumentException naming the offending class.

Solutions

  1. Register the handler only for actual enum types: verify Class.isEnum() (or @Alias target) before registering
  2. Fix the javaType value in the configuration to point at the real enum class
  3. For constant-holder classes (public static final ints), use a regular type handler, not an enum handler

Example fix

// before
<typeHandler handler="...EnumOrdinalTypeHandler" javaType="com.example.StatusHolder"/>

// after
<typeHandler handler="...EnumOrdinalTypeHandler" javaType="com.example.Status"/> // real enum
Defensive patterns

Strategy: validation

Validate before calling

if (!SomeClass.class.isEnum()) {
  throw new IllegalArgumentException(SomeClass.class.getName() + " is not an enum; cannot use an enum TypeHandler");
}

Type guard

static boolean isEnumType(Class<?> c) { return c != null && c.isEnum(); }

Prevention

When it happens

Trigger: Registering EnumOrdinalTypeHandler (or EnumTypeHandler) for a plain class — a class containing enum-like constants, an interface, or a non-enum POJO specified via javaType= or defaultEnumTypeHandler.

Common situations: Setting <setting name="defaultEnumTypeHandler" .../> to EnumOrdinalTypeHandler while the model also contains non-enum classes; mistyping the javaType so it resolves to a wrapper or interface instead of the enum.

Related errors


AI-assisted analysis of mybatis/mybatis-3@008069adb1 (2026-08-14). Data as JSON: /api/errors/b261ddbe0dcc6756. Report an issue: GitHub.

Appendix: source

Thrown at src/main/java/org/apache/ibatis/type/EnumOrdinalTypeHandler.java:38

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author Clinton Begin
 */
public class EnumOrdinalTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {

  private final Class<E> type;
  private final E[] enums;

  public EnumOrdinalTypeHandler(Class<E> type) {
    if (type == null) {
      throw new IllegalArgumentException("Type argument cannot be null");
    }
    this.type = type;
    this.enums = type.getEnumConstants();
    if (this.enums == null) {
      throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
    }
  }

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
    ps.setInt(i, parameter.ordinal());
  }

  @Override
  public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
    int ordinal = rs.getInt(columnName);
    if (ordinal == 0 && rs.wasNull()) {
      return null;
    }
    return toOrdinalEnum(ordinal);
  }

  @Override

View on GitHub (pinned to 008069adb1)