- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到了 Spring-Mybatis 多态性问题。详细信息如下:我有一个实体
:
public class SegmentEntity {
private int id;
private String name;
private Filter filter;
// getter and setter
}
public class Filter {
private String type;
}
其中过滤器是多态的。Filter有一些子类,例如:
public class OneFilter extends Filter {
private String field1;
private int field2;
}
public class AnotherFilter extends Filter {
private List<Integer> field3;
private double field4;
}
正如您所看到的,除了 type
之外,每个子类都有不同的架构。
MySQL表段
如下:
CREATE TABLE `segment` {
`id` int(11) NUL NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`filter` varchar(1024) NOT NULL,
PRIMARY KEY (`id`)
} ENGINE=InnoDB DEFAULT CHARSET=utf8;
因此,为了在 MYSQL 中反序列化 filter
(varchar),我制作了这个 FilterTypeHandler:
public class FilterTypeHandler implements TypeHandler<Filter> {
@Override
public Filter getResult(ResultSet rs, String columnName) throws SQLException {
String json = rs.getString(columnName);
Filter filter = null;
try {
filter = new ObjectMapper().readValue(json, Filter.class);
} catch (IOException e) {}
return filter;
}
}
为了让 Jackson 进行多态反序列化,我更改了 Filter 类:
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = OneFilter.class, name = "someTypeName"),
@JsonSubTypes.Type(value = AnotherFilter.class, name = "anotherTypeName")})
public class Filter {
private String type;
}
但结果是,jackson ObjectMapper 无法反序列化所有消息。
那么是不是有什么问题呢?我应该采取什么正确步骤?任何有用的链接或文档都会有帮助。
最佳答案
我已经使用 jackson 自定义解串器解决了我的问题。这是我的解决方案:
首先我重构我的bean,例如:
@JsonDeserialize(using = FilterJsonDeserializer.class)
public interface Filter {
}
和:
@JsonDeserialize(as = OneFilter.class)
public class OneFilter implements Filter, Serializable {
private String type;
private String field1;
private int field2;
@JsonCreator
public OneFilter(@JsonProperty("type") String type, @JsonProperty("field1") String field1, @JsonProperty("field2") int field2) {
// omit
}
// getter and setter
// override toString
}
@JsonDeserialize(as = AnotherFilter.class)
public class AnotherFilter implements Filter, Serializable {
private String type;
private List<Integer> field3;
private double field4;
@JsonCreator
public AnotherFilter(@JsonProperty("type") String type, @JsonProperty("field3") List<Integer> field3, @JsonProperty("field4") double field4) {
// omit
}
// getter and setter
// override toString
}
而 FilterJsonDeserializer
是:
public class FilterJsonDeserializer extends JsonDeserializer<Filter> {
private static final String TYPE = "type";
@Override
public Filter deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
Filter result = null;
ObjectMapper = mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = mapper.readTree(jp);
if (root.has(TYPE)) {
String filterType = root.get(TYPE).asText();
switch (filterType) {
case FILTER1:
result = mapper.readValue(root.toString(), OneFilter.class);
break;
case FILTER2:
result = mapper.readValue(root.toString(), AnotherFilter.class);
break;
default:
throw new IllegalArgumentException("Not supported filter type.");
}
}
return result;
}
}
关于java - Spring Mybatis 多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40785525/
1.概述 转载:MyBatis 二级缓存全详解 上一篇文章中我们介绍到了 MyBatis 一级缓存其实就是 SqlSession 级别的缓存,什么是 SqlSession 级别的缓存呢?一级缓存的本质
1.概述 转载:核心配置综述之StatementHandler 2.MyBatis 四大组件之StatementHandler StatementHandler 是四大组件中最重要的一个对象,负责操作
1.概述 转载:MyBatis 启动流程 MyBatis 是第一个支持自定义 SQL、存储过程和高级映射的类持久框架。MyBatis 消除了大部分 JDBC 的样板代码、手动设置参数以及检索结果。My
1.概述 转载:MyBatis 基础搭建及架构概述 2.MyBatis 是什么? MyBatis是第一个支持自定义SQL、存储过程和高级映射的类持久框架。MyBatis消除了大部分JDBC的样板代码、
1.概述 转载:核心配置综述之 ParameterHandler MyBatis 四大核心组件我们已经了解到了两种,一个是 Executor ,它是MyBatis 解析SQL请求首先会经过的第一道关卡
1.概述 转载:核心配置综述之 ResultSetHandler 我们之前介绍过了MyBatis 四大核心配置之 Executor、StatementHandler、 ParameterHandler
如果我使用mybatis,我可以很容易地得到更新的行数,就像 update table set desc = 'xxx' where name = ? 但是,如果我想获取更新的行数,而不是计数,我该如
如何在MyBatis 3中使用小于等于 SELECT * FROM( SELECT * FROM TABLE1 WHERE COL1 =#{COL1,jdbc
我将 mybatis3.0.6 与 java 一起使用 哪个性能更好? [select id="getData" parameterType="Integer" resultType="Integer
我无法在 mybatis 中使用动态排序类型创建 SQL,如下例 select user_profile.user_profile_id, user_profile.first_name
这是一个流行的例子。 insert into ACCOUNT ( ACC_ID, ACC_FIRST_NAME, ACC_LAST_NAME, ACC_EMAIL )values (
我下载了MyBatis,文件夹中有一个mybatis-3.0.4-javadoc.jar,我解压并打开它,但它几乎是空的。 哪里可以找到MyBatis的API文档? 最佳答案 http://repo1
我正在尝试为 ArrayList 编写类型处理程序,但这给了我错误,任何人都可以帮助我。 我想将 ArrayList 作为 VARCHAR 存储在数据库中并将其检索为 ArrayList。 packa
目录 依赖 配置 CodeGenerator mybatis-plus-generator + clickhouse 自动生成代码 依赖
目录 三者实现对比 使用fluent mybatis 来实现上面的功能 换成mybatis原生实现效果 换成mybatis plus
例如,我有查询从员工中选择 ID、姓名、年龄、地址,而不是拥有员工对象列表。我希望有一个 map 列表,如 list{ map{ ("id", 123), ("name","jac
我在使 MyBatis (3.4.6) 工作时遇到一些麻烦。 我已将 mybatis-config.xml 文件放置在项目的 src/main/resources 文件夹中,但是当我运行单元测试时,出
我现在使用 Mybatis 和 spring-boot。我没有添加mybatis-config.xml。我根据说明通过 application.properties 为数据源和 mybatis 进行所
这是我的第一篇文章,用我糟糕的英语...... 我使用的是MyBatis3.0 在查询中,我使用 SqlBuilder 的方法如下: public class DataStatisticSqlBuil
主题:MyBatis:Boolean Paraeter:MyBatis 正在使用 Getter 内容: 大家好, 我一直在寻找解决我近乎简单的 MyBatis 问题的方法: 给定代码(仅必要部分):
我是一名优秀的程序员,十分优秀!