我正在創建一個具有以下結構的 Spring JPA 專案:
public class Pipeline {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
private SourceConfig sourceConfig;
private SinkConfig sinkConfig;
...
...
}
public abstract class SourceConfig {
private long id;
private String name;
}
public abstract class SinkConfig {
private long id;
private String name;
}
public KafkaSourceConfig extends SourceConfig {
private String topic;
private String messageSchema;
}
public MysqlSourceConfig extends SourceConfig {
private String databaseName;
private String tableName;
}
現在當客戶端傳遞以下 JSON 時,程式如何知道要添加到 Pipeline 物件的 SourceConfig 子類?
{
"name": "mysql_to_bq_1",
"sourceConfig": {
"source": "MYSQL",
},
"sinkConfig": {
},
"createdBy": "paul"
}
uj5u.com熱心網友回復:
您需要像這樣指定要使用的型別別所以而不是
private SourceConfig sourceConfig;
利用
private KafkaSourceConfig kafkaSourceConfig;
或者您可以像以前一樣保留它,但是如果您想使用子類的某些屬性,則必須將其強制轉換為該型別別。
例如
KafkaSourceConfig kafkaSourceConfig = (KafkaSourceConfig)sourceConfig;
它看起來像這樣
if(sourceConfig instanceOf KafkaSourceConfig)
{
KafkaSourceConfig ksc = (KafkaSourceConfig)sourceConfig;
}
if(sourceConfig instanceOf MysqlSourceConfig)
{
MysqlSourceConfig mysc= (MysqlSourceConfig)sourceConfig;
}
uj5u.com熱心網友回復:
我環顧四周,了解了 Jackson 支持的多型反序列化。
使用 Jackson 將 JSON 反序列化為多型型別 - 一個完整的示例給了我一個編譯錯誤
本質上,我們必須從提供的 JSON 中從某個欄位推斷要參考哪個子類。
例如,
"sourceConfig": {
"source": "MYSQL"
}
這應該呼叫 MysqlSourceConfig 的建構式。所以下面的代碼完成了作業。
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Data
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
property = "source",
defaultImpl = MysqlSourceConfig.class,
visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = MysqlSourceConfig.class, name = "MYSQL"),
@JsonSubTypes.Type(value = KafkaSourceConfig.class, name = "KAFKA"),
})
public abstract class SourceConfig {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(value = EnumType.STRING)
@NotNull
private Source source;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/528452.html
下一篇:將陣列作為引數傳遞python
