私はSpring-Mybatis Polyporphismの問題に苦しんでいます。ここでは、詳細は以下のとおりです。 私はEntity
を持っている:スプリングMybatis多型
public class SegmentEntity {
private int id;
private String name;
private Filter filter;
// getter and setter
}
public class Filter {
private String type;
}
フィルターが多型であるところ。あなたが見ることができるように、各サブクラスはtype
除く異なるスキーマを持つ
public class OneFilter extends Filter {
private String field1;
private int field2;
}
public class AnotherFilter extends Filter {
private List<Integer> field3;
private double field4;
}
: は次のように、フィルター上のいくつかのサブクラスがあります。以下のような
とMySQLテーブルsegment
:
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;
}
}
とジャクソンが多型のデシリアライズを行うようにするために:
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を作ります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はすべてのメッセージを逆シリアル化できません。
何か問題がありますか?私は何をすべきでしょうか? 便利なリンクやドキュメントがあります。
A lsoは、create(@RequestBody SegmentEntity segmentEntity)のようなコントローラSegmentControllerを使用してe segmentEntityを作成するときに、デシリアライズもコード化するのが難しいです。 –