gpt4 book ai didi

java - 使用 JsonTypeInfo.As.EXTERNAL_PROPERTY 而不指定 @JsonSubTypes

转载 作者:太空宇宙 更新时间:2023-11-04 09:57:19 26 4
gpt4 key购买 nike

是否可以使用@JsonTypeInfo.As.EXTERNAL_PROPERTY而无需使用@JsonSubtypes指定子类型?

用例是我想要创建公共(public)基类,它具有在其他项目中声明的不同主体。

公共(public)基类,包含公共(public)字段和主体

public class ApiModel<T extends ApiBodyModel> {

private String modelType;
private String version;
private T body;

... getters / setters

}

抽象的 body 模型,其中有进一步共享的上下文。

@JsonTypeInfo(use = Id.NAME, include = As.EXTERNAL_PROPERTY, property = "modelType")
//@JsonTypeIdResolver(InheritanceTypeIdResolver.class)
public abstract class ApiBodyModel<T extends ApiBodyModel<T>> {

@JsonProperty
private ApiContextModel context;

public T withContext(ApiContextModel context) {
this.context = context;
return (T) this;
}

... getters / setters

}

允许我放弃使用 @JsonSubTypes 的一个解决方案是使用 Reflection 来获取抽象 ApiBodyModel 的所有子类型,详细信息请参见 https://gist.github.com/root-talis/36355f227ff5bb7a057ff7ad842d37a3 ,但它仍然需要在主体内声明类名,而不是向上一级声明。

使用 @JsonTypeInfo.As.EXTERNAL_PROPERTY 找到的示例已声明 JsonSubTypes,但我想避免这种情况,因为抽象类将位于公共(public)项目中。

最佳答案

我通过让顶级类使用 InheritanceTypeIdResolver 解决了这个问题

公共(public)基类,包含公共(public)字段和主体

@JsonTypeInfo(use = Id.CUSTOM, property = "modelType", visible = true)
@JsonTypeIdResolver(InheritanceTypeIdResolver.class)
public abstract class ApiModel<T extends ApiBodyModel> {

private String modelType;
private String version;

public abstract T getBody();

public abstract void setBody(T body);

}

抽象的 body 模型,其中有进一步共享的上下文。

public abstract class ApiBodyModel {

private ApiContextModel context;

}

具体基类实现

public class ConcreteModel extends ApiModel<ConcreteBody> {

public static final String MODEL_TYPE = "concreteModel";

private ConcreteBody body;

public ConcreteModel(
String version,
ConcreteBody body) {
super(MODEL_TYPE, version);
this.body = body;
}
}

具体主体实现

public class ConcreteBody extends ApiBodyModel {

private String source;

public ConcreteBody(ApiContextModel context, String source) {
super(context);
this.source = source;
}
}

关于java - 使用 JsonTypeInfo.As.EXTERNAL_PROPERTY 而不指定 @JsonSubTypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53959044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com