自定义 TypeHandler 中的 Mybatis 空配置对象

Mybatis null configuration object inside custom TypeHandler

我正在编写自定义 JsonTypeHandler,代码工作正常,但我想访问扩展 BaseTypeHandler 的配置字段,它似乎总是空的。 为什么它是空的?我在这里遗漏了什么吗?

自定义 JsonTypeHandler:您可以忽略下面代码中的方法。

@MappedTypes({ JsonObject.class })
@MappedJdbcTypes({JdbcType.NVARCHAR})
public class JsonTypeHandler extends BaseTypeHandler<JsonObject> {

    private String sqlDialect;

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JsonObject parameter, JdbcType jdbcType)
            throws SQLException {
        String parameterAsString = new Gson().toJson(parameter, JsonObject.class);
            ps.setString(i, parameterAsString);
    }

    @Override
    public JsonObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String sqlJson = rs.getString(columnName);
        if (null != sqlJson) {
            return new Gson().fromJson(sqlJson, JsonObject.class);
        }
        return null;
    }

    @Override
    public JsonObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String sqlJson = rs.getString(columnIndex);
        if (null != sqlJson) {
            return new Gson().fromJson(sqlJson, JsonObject.class);
        }
        return null;
    }

    @Override
    public JsonObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String sqlJson = cs.getString(columnIndex);
        if (null != sqlJson) {
            return new Gson().fromJson(sqlJson, JsonObject.class);
        }
        return null;
    }
}

mybatis-config.xml

<configuration>
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="jdbcTypeForNull" value="NULL"/>
    </settings>

    <typeHandlers>
        <typeHandler handler="com.dummy.JsonTypeHandler" javaType="com.google.gson.JsonObject"/>
    </typeHandlers>

    <databaseIdProvider type="DB_VENDOR">
        <property name="PostgreSql" value="postgres"></property>
    </databaseIdProvider>

    <mappers>
        <!--mappers-->
    </mappers>
</configuration>

spring-context.xml

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation"
                  value="classpath:com/dummy/mybatis/mybatis-config.xml"/>
        <property name="dataSource" ref="postgresDataSource"/>
</bean>

版本:

dependency 'org.mybatis:mybatis:3.4.1'
mavenBom 'org.springframework:spring-framework-bom:5.2.6.RELEASE'

我的目的是从 BaseTypeHandler 中的配置对象中获取 databaseId。希望片段是可重现的。

如本 issue 中所述,字段 BaseTypeHandler.configuration 是错误添加的,计划删除。

您可以在设置必要的属性后注册类型处理程序的实例,而不是注册 Class。 它看起来像这样:

JsonTypeHandler handler = new JsonTypeHandler(configuration);
configuration.getTypeHandlerRegistry().register(..., handler, ...);