{"record":{"id":"43786a38f9d47d14","repo":"baomidou/mybatis-plus","slug":"type-argument-cannot-be-null","errorCode":null,"errorMessage":"Type argument cannot be null","messagePattern":"Type argument cannot be null","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/handlers/CompositeEnumTypeHandler.java","lineNumber":45,"sourceCode":"import java.sql.PreparedStatement;\nimport java.sql.ResultSet;\nimport java.sql.SQLException;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * @author miemie\n * @since 2022-03-07\n */\npublic class CompositeEnumTypeHandler<E extends Enum<E>> implements TypeHandler<E> {\n\n    private static final Map<Class<?>, Boolean> MP_ENUM_CACHE = new ConcurrentHashMap<>();\n    private static Class<? extends TypeHandler> defaultEnumTypeHandler = EnumTypeHandler.class;\n    private final TypeHandler<E> delegate;\n\n    public CompositeEnumTypeHandler(Class<E> enumClassType) {\n        if (enumClassType == null) {\n            throw new IllegalArgumentException(\"Type argument cannot be null\");\n        }\n        if (CollectionUtils.computeIfAbsent(MP_ENUM_CACHE, enumClassType, EnumUtils::isMpEnums)) {\n            delegate = new MybatisEnumTypeHandler<>(enumClassType);\n        } else {\n            delegate = getInstance(enumClassType, defaultEnumTypeHandler);\n        }\n    }\n\n    public static void setDefaultEnumTypeHandler(Class<? extends TypeHandler> defaultEnumTypeHandler) {\n        if (defaultEnumTypeHandler != null && !MybatisEnumTypeHandler.class.isAssignableFrom(defaultEnumTypeHandler)) {\n            CompositeEnumTypeHandler.defaultEnumTypeHandler = defaultEnumTypeHandler;\n        }\n    }\n\n    @Override\n    public void setParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {\n        delegate.setParameter(ps, i, parameter, jdbcType);\n    }","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/baomidou/mybatis-plus/blob/bf67d907478c724120bf76292da54abf9e73c2b3/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/handlers/CompositeEnumTypeHandler.java#L27-L63","documentation":"CompositeEnumTypeHandler was constructed with a null enum class. This handler is created by the TypeHandlerRegistry for enum-typed properties; a null type argument means the registry could not determine the Java type for the property being mapped (e.g. an unresolvable javaType).","triggerScenarios":"A mapper XML/resultMap/parameterMap references an enum type that resolves to null (typo'd javaType FQCN, or a generic property whose type cannot be inferred), causing the registry to instantiate CompositeEnumTypeHandler(null).","commonSituations":"Setting default-enum-type-handler to CompositeEnumTypeHandler in configuration while some statement has an unresolvable javaType; using raw/generic wrapper types where reflection cannot determine the enum; misconfigured mybatis-plus.type-enums-package setups in older versions.","solutions":["Check the resultMap/parameterMap javaType attributes in the mapper named in the stack trace and fix unresolvable class names","Declare the concrete enum type on the mapper method parameter or entity field so the registry knows the type","Verify the enum class is on the classpath and not shaded/renamed"],"exampleFix":"<!-- before -->\n<result property=\"status\" javaType=\"com.exmaple.Status\"/>\n<!-- after -->\n<result property=\"status\" javaType=\"com.example.Status\"/>","handlingStrategy":"validation","validationCode":"// Ensure every enum property has a concrete javaType before the session is built\nif (methodParamOrFieldType == null || !Enum.class.isAssignableFrom(it)) {\n    throw new IllegalStateException(\"Enum property must resolve to a concrete enum type\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always declare explicit javaType on resultMap properties for enums","Avoid raw/generic (Object/T) fields that must be mapped as enums","Test one representative query per enum-mapped entity at startup"],"tags":["mybatis","type-handler","enum","mapping"],"backgroundTag":null,"analyzedSha":"bf67d907478c724120bf76292da54abf9e73c2b3","analyzedAt":"2026-08-14T15:17:09.543Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}