简体   繁体   English

Mybatis null 配置 object 里面自定义 TypeHandler

[英]Mybatis null configuration object inside custom TypeHandler

I was writing a custom JsonTypeHandler , code works fine but I wanted access to configuration field of extended BaseTypeHandler which seems always null.我正在编写一个自定义JsonTypeHandler ,代码工作正常,但我想访问扩展BaseTypeHandler的配置字段,这似乎总是 null。 Why is it null?为什么是 null? Am I missing something here?我在这里错过了什么吗?

空配置调试图像

Custom JsonTypeHandler: You may ignore methods inside below code.自定义 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 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弹簧上下文.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>

Versions:版本:

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

My intention is to get databaseId from configuration object inside BaseTypeHandler .我的意图是从BaseTypeHandler内的配置 object 中获取databaseId Hope snippets are reproducible.希望片段是可重现的。

As explained in this issue , the field BaseTypeHandler.configuration is added by mistake and is planned to be removed.本期所述, BaseTypeHandler.configuration字段是错误添加的,计划删除。

You can register an instance of the type handler after setting necessary properties instead of registering the Class .您可以在设置必要的属性后注册类型处理程序的实例,而不是注册Class It would look something like this:它看起来像这样:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM