{"record":{"id":"63d6067bf1ccfc27","repo":"mybatis/mybatis-3","slug":"the-defaultobjectwrapperfactory-should-never-be-ca","errorCode":null,"errorMessage":"The DefaultObjectWrapperFactory should never be called to provide an ObjectWrapper.","messagePattern":"The DefaultObjectWrapperFactory should never be called to provide an ObjectWrapper\\.","errorType":"exception","errorClass":"ReflectionException","httpStatus":null,"severity":"warning","filePath":"src/main/java/org/apache/ibatis/reflection/wrapper/DefaultObjectWrapperFactory.java","lineNumber":33,"sourceCode":" */\npackage org.apache.ibatis.reflection.wrapper;\n\nimport org.apache.ibatis.reflection.MetaObject;\nimport org.apache.ibatis.reflection.ReflectionException;\n\n/**\n * @author Clinton Begin\n */\npublic class DefaultObjectWrapperFactory implements ObjectWrapperFactory {\n\n  @Override\n  public boolean hasWrapperFor(Object object) {\n    return false;\n  }\n\n  @Override\n  public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {\n    throw new ReflectionException(\n        \"The DefaultObjectWrapperFactory should never be called to provide an ObjectWrapper.\");\n  }\n\n}\n","sourceCodeStart":15,"sourceCodeEnd":38,"githubUrl":"https://github.com/mybatis/mybatis-3/blob/008069adb1b089579b5dcba87ee591908b263274/src/main/java/org/apache/ibatis/reflection/wrapper/DefaultObjectWrapperFactory.java#L15-L38","documentation":"DefaultObjectWrapperFactory is MyBatis's no-op ObjectWrapperFactory: hasWrapperFor always returns false, meaning it never supplies wrappers, and MetaObject therefore never calls getWrapperFor on it. If getWrapperFor is invoked anyway (direct call or a subclass/misuse that bypasses hasWrapperFor), it throws a ReflectionException stating it should never be called. This is a guard against incorrect API usage, not a runtime data problem.","triggerScenarios":"Directly calling new DefaultObjectWrapperFactory().getWrapperFor(metaObject, obj); custom code that iterates ObjectWrapperFactory instances calling getWrapperFor unconditionally without checking hasWrapperFor first.","commonSituations":"Custom reflection utilities built on MetaObject internals; copy-pasted framework code that assumes every factory produces wrappers; tests poking at wrapper factories directly.","solutions":["Always gate getWrapperFor with hasWrapperFor(object) returning true (the DefaultObjectWrapperFactory contract)","Provide your own ObjectWrapperFactory implementation if you need custom wrapping","Remove direct calls to DefaultObjectWrapperFactory.getWrapperFor; rely on MetaObject/ObjectWrapperFactory.DEFAULT"],"exampleFix":"// before\nObjectWrapper w = factory.getWrapperFor(metaObject, obj); // throws on DefaultObjectWrapperFactory\n\n// after\nObjectWrapper w = factory.hasWrapperFor(obj)\n    ? factory.getWrapperFor(metaObject, obj)\n    : MetaObject.forObject(obj, objectFactory, factory, reflectorFactory).getObjectWrapper();","handlingStrategy":"validation","validationCode":"if (factory.hasWrapperFor(object)) {\n  wrapper = factory.getWrapperFor(metaObject, object);\n} else {\n  // fall back to standard MetaObject wrapping; never call getWrapperFor on DefaultObjectWrapperFactory directly\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never bypass the hasWrapperFor gate on ObjectWrapperFactory","Provide a custom ObjectWrapperFactory when custom wrapping is required","Treat DefaultObjectWrapperFactory as a terminal no-op implementation"],"tags":["reflection","api-misuse","object-wrapper","mybatis"],"backgroundTag":null,"analyzedSha":"008069adb1b089579b5dcba87ee591908b263274","analyzedAt":"2026-08-14T13:07:10.264Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}