{"record":{"id":"e1e21be2c9c11ce6","repo":"mybatis/mybatis-3","slug":"this-getclass-must-override-the-defaul-e1e21b","errorCode":null,"errorMessage":"'\" + this.getClass() + \"' must override the default method 'getGenericGetterType()'.","messagePattern":"'\" \\+ this\\.getClass\\(\\) \\+ \"' must override the default method 'getGenericGetterType\\(\\)'\\.","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"src/main/java/org/apache/ibatis/reflection/wrapper/ObjectWrapper.java","lineNumber":51,"sourceCode":"  void set(PropertyTokenizer prop, Object value);\n\n  String findProperty(String name, boolean useCamelCaseMapping);\n\n  String[] getGetterNames();\n\n  String[] getSetterNames();\n\n  Class<?> getSetterType(String name);\n\n  Class<?> getGetterType(String name);\n\n  default Entry<Type, Class<?>> getGenericSetterType(String name) {\n    throw new UnsupportedOperationException(\n        \"'\" + this.getClass() + \"' must override the default method 'getGenericSetterType()'.\");\n  }\n\n  default Entry<Type, Class<?>> getGenericGetterType(String name) {\n    throw new UnsupportedOperationException(\n        \"'\" + this.getClass() + \"' must override the default method 'getGenericGetterType()'.\");\n  }\n\n  boolean hasSetter(String name);\n\n  boolean hasGetter(String name);\n\n  MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory);\n\n  boolean isCollection();\n\n  void add(Object element);\n\n  <E> void addAll(List<E> element);\n\n}\n","sourceCodeStart":33,"sourceCodeEnd":68,"githubUrl":"https://github.com/mybatis/mybatis-3/blob/008069adb1b089579b5dcba87ee591908b263274/src/main/java/org/apache/ibatis/reflection/wrapper/ObjectWrapper.java#L33-L68","documentation":"The getter-side twin of getGenericSetterType: ObjectWrapper.getGenericGetterType(String) is a default method whose body only throws UnsupportedOperationException naming the class that must override it. It resolves the full generic Type of a readable property for generic-aware TypeHandler selection; wrappers that don't implement it (e.g. CollectionWrapper) throw when it is called.","triggerScenarios":"metaObject.getObjectWrapper().getGenericGetterType(name) invoked on a wrapper without the override; MyBatis parameter/result resolution paths that need the generic element type of a property (e.g. List<Item> items) running against a custom or minimal ObjectWrapper.","commonSituations":"Custom ObjectWrapper implementations predating the 3.5.x generic-type APIs; upgrading MyBatis where the framework began calling getGenericGetterType during parameter handling; direct API use in reflection utilities.","solutions":["Override getGenericGetterType(String name) in your custom ObjectWrapper (typically delegating to MetaClass/Reflector generic info)","Prefer BeanWrapper/MapWrapper, which override the method, when generic resolution is required","Do not call generic property type methods on collection wrappers that have no properties"],"exampleFix":"// before\nclass MyWrapper implements ObjectWrapper { /* no getGenericGetterType */ }\n\n// after\n@Override\npublic Entry<Type, Class<?>> getGenericGetterType(String name) {\n  Class<?> raw = metaClass.getGetterType(name);\n  return Map.Entry.entry(raw, raw);\n}","handlingStrategy":"validation","validationCode":"ObjectWrapper w = metaObject.getObjectWrapper();\nif (w instanceof org.apache.ibatis.reflection.wrapper.BeanWrapper\n    || w instanceof org.apache.ibatis.reflection.wrapper.MapWrapper) {\n  var t = w.getGenericGetterType(name);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Implement getGenericGetterType in custom ObjectWrapper implementations","Review ObjectWrapper default methods after each MyBatis 3.5.x upgrade","Avoid generic-type queries on collection wrappers that have no properties"],"tags":["reflection","spi","object-wrapper","generics","mybatis"],"backgroundTag":null,"analyzedSha":"008069adb1b089579b5dcba87ee591908b263274","analyzedAt":"2026-08-14T13:07:10.264Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}