[英]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.