Mybatis problem - convey parameter to my TypeHandler class through MyObjectFactory

Viewed 123

I have class TypeHandler that works normal. But now i need to convey parametr - DB schema inside TypeHandler. I dont need to use this DB schema parametr as result, so i dont map it in mybatis-config.xml

Schema parametr used in CallableStatement in ClobTypeHandler.

    public class ClobTypeHandler extends BaseTypeHandler<String> {
        public String scheme;
    
        public ClobTypeHandler(String scheme) {
            this.scheme = scheme;
        }
    
        public ClobTypeHandler() {
        } 

I've created my object factory:

public class ComponentObjectFactory extends DefaultObjectFactory {
                 String scheme;

                 public ComponentObjectFactory() {
                 }

                 public void setScheme(String scheme) {
                     this.scheme = scheme;
                 }

                 public <T> T create(Class<T> type) {
                     System.out.println("create:" + type);
                     return super.create(type);
                 }

                 public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
                     if (type.equals(ClobTypeHandler.class)) {
                         String scheme = (String)constructorArgs.get(0);
                         ClobTypeHandler cth = (ClobTypeHandler)super.create(type, constructorArgTypes, constructorArgs);
                         cth.scheme = scheme;
                         return cth;
                     } else {
                         return super.create(type, constructorArgTypes, constructorArgs);
                     }
                 }
             }

And registered it in mybatis-config:

<typeHandlers>
        <typeHandler javaType="java.lang.String"
                     jdbcType="CLOB"
                     handler="model.DB.ClobTypeHandler"/>
</typeHandlers>

<objectFactory type="services.ComponentObjectFactory">
    <property name="name" value="ComponentObjectFactory"/>
</objectFactory>

But when myBatis creates an instance of ClobTypeHandler - it not uses my ComponentObjectFactory and even don't come to DefaultObjectFactory. I set breakpoints in constructors there and see it. As result when debug comes to ClobTypeHandler - it s another instance, not my, that i created as

  ComponentObjectFactory cof = new ComponentObjectFactory();
cof.create(ClobTypeHandler.class, Arrays.asList(String.class), Arrays.asList(this.scheme));
  1. How to force myBatis use my instance of ClobTypeHandler ?

  2. How to force myBatis use my ComponentObjectFactory ?

  3. How to force myBatis use only parameter constructor to convey schema parametr there ?

0 Answers
Related