首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义TypeHandler中的Mybatis null配置对象

自定义TypeHandler中的Mybatis null配置对象
EN

Stack Overflow用户
提问于 2020-06-24 12:42:16
回答 1查看 193关注 0票数 0

我正在写一个自定义的JsonTypeHandler,代码运行良好,但我想访问扩展BaseTypeHandler的配置字段,它似乎总是空的。为什么它是空的?我是不是漏掉了什么?

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

代码语言:javascript
复制
@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

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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>

版本:

代码语言:javascript
复制
dependency 'org.mybatis:mybatis:3.4.1'
mavenBom 'org.springframework:spring-framework-bom:5.2.6.RELEASE'

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-26 00:52:26

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

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

代码语言:javascript
复制
JsonTypeHandler handler = new JsonTypeHandler(configuration);
configuration.getTypeHandlerRegistry().register(..., handler, ...);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62547781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档