【发布时间】:2021-04-07 15:48:02
【问题描述】:
我正在使用包含 Set<UUID> 和 Set<String> 的 DTO。
public class MyBatisDTO implements Serializable{
// other attributes
private Set<UUID> uuidSet;
private Set<String> stringSet;
.....
}
已经为 Generic-Type Set<T> 注册了一个 typeHandler。
@MappedJdbcTypes(JdbcType.OTHER)
@MappedTypes(Set.class)
public class SetTypeHandler extends BaseTypeHandler<Set<T>> {
@Override
public Set<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {
return mapFromJson(rs.getString(columnName));
}
.......
现在的问题是,当上面提到的 MyBatisDTO.java 是从 DB 值映射时,uuidSet 和 stringset 两列都存储为 jsonb 值,typeHandler 选择通用类型as String -> T extends String for Set<UUID> uuidSet; 也导致自动类型转换为 uuidSet 作为 String 的所有项目。这不是错误,但在调试中可以看到uuidSet 包含String 值。
稍后,这也导致了 JAX-RS 响应的反序列化,但这是另一个目前并不重要的主题。
我的问题是 有没有办法可以在属性级别强制执行 typeHandler?所以我正在寻找一种解决方案,我可以在属性级别附加自定义 TypeHandler,就像这样
//SUDO_CODE
public class MyBatisDTO implements Serializable{
// other attributes
@TypeHandler ("com.mybatis.handlers.typeHandler.SetUUIDTypeHandler")
private Set<UUID> uuidSet;
@TypeHandler ("com.mybatis.handlers.typeHandler.SetStringTypeHandler")
private Set<String> stringSet;
.....
}
或者如果有办法在 Mapper-Level 上提及这些 typeHandlers,像这样?
@Mapper
public interface MyBatisMapper {
//TYPE HANDLER ATTACHMENT/CONFIGURATION HERE ..???
@Select("SELECT uuidSet, stringSet FROM MyBatisDTO WHERE param = #{param}")
Cursor<MyBatisDTO> getData(@Param("param") final UUID param);
.....
}
【问题讨论】:
标签: java postgresql jersey jax-rs mybatis