Spring REST JSON serialization/deserialization 复合多态类型
Spring REST JSON serialization/deserialization of composite polymorphic types
我使用 Spring/Spring Boot 和 Spring MVC with @RestController
我有一个复合模型对象:
public abstract class BaseQuery {
private final Long characteristicId;
...
}
public abstract class ComparableQuery extends BaseQuery {
private final Object value;
private final String comparisonOperator;
...
}
public class GreaterOrEqualQuery extends ComparableQuery {
public GreaterOrEqualQuery(Long characteristicId, Object value) {
super(characteristicId, value, ">=");
}
}
public class EqualQuery extends ComparableQuery {
public EqualQuery(Long characteristicId, Object value) {
super(characteristicId, value, "=");
}
}
public class GreaterQuery extends ComparableQuery {
public GreaterQuery(Long characteristicId, Object value) {
super(characteristicId, value, ">");
}
}
public class CompositQuery extends BaseQuery {
private final String operator;
private final BaseQuery[] queries;
public CompositQuery(Long characteristicId, Operator operator, BaseQuery... queries) {
super(characteristicId);
this.operator = operator.value;
this.queries = queries;
}
...
}
等等
此模型的示例用法如下所示:
Set<BaseQuery> queries = new HashSet<>();
BaseQuery megapixelCharacteristicQuery = new CompositQuery(megapixelCharacteristic.getCharacteristicId(), CompositQuery.Operator.AND, new GreaterOrEqualQuery(megapixelCharacteristic.getCharacteristicId(), 10), new LessOrEqualQuery(megapixelCharacteristic.getCharacteristicId(), 50));
queries.add(megapixelCharacteristicQuery);
queries.add(new EqualQuery(androidCharacteristic.getCharacteristicId(), true));
Set<BaseQuery> queries
的序列化 JSON 对象看起来像:
[
{
"operator":"AND",
"queries":[
{
"value":10,
"comparisonOperator":"\u003e\u003d",
"characteristicId":391
},
{
"value":50,
"comparisonOperator":"\u003c\u003d",
"characteristicId":391
}
],
"characteristicId":391
},
{
"value":true,
"comparisonOperator":"\u003d",
"characteristicId":383
}
]
我必须将此或类似的 JSON 从客户端应用程序 (AngularJS) 传递到我的后端 REST API 端点,以便获得如上所述的正确反序列化模型(设置使用适当的条目,例如 CompositQuery
或 EqualQuery
).
现在,我的 Rest 控制器中的 Spring 应用程序后端逻辑无法使用适当的 类.
正确反序列化此 JSON
Spring 中是否有任何方法可以为此 JSON 提供一些元信息(或其他信息)以帮助 Spring 正确反序列化此结构?
您可以在超类上使用 jackson 注释来实现此目的,如下所示:
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "javaclass")
@JsonSubTypes({
@Type(value = GreaterOrEqualQuery.class),
@Type(value = EqualQuery.class)
//and so on...
})
public abstract class BaseQuery {
...
}
这会将 javaclass
属性 添加到 json 表示中,这是 use = JsonTypeInfo.Id.CLASS
情况下的完全限定名称。为了简化此 属性 的值,请考虑 @JsonTypeInfo
的 use
参数的不同选项(例如 JsonTypeInfo.Id.NAME
)。
我使用 Spring/Spring Boot 和 Spring MVC with @RestController
我有一个复合模型对象:
public abstract class BaseQuery {
private final Long characteristicId;
...
}
public abstract class ComparableQuery extends BaseQuery {
private final Object value;
private final String comparisonOperator;
...
}
public class GreaterOrEqualQuery extends ComparableQuery {
public GreaterOrEqualQuery(Long characteristicId, Object value) {
super(characteristicId, value, ">=");
}
}
public class EqualQuery extends ComparableQuery {
public EqualQuery(Long characteristicId, Object value) {
super(characteristicId, value, "=");
}
}
public class GreaterQuery extends ComparableQuery {
public GreaterQuery(Long characteristicId, Object value) {
super(characteristicId, value, ">");
}
}
public class CompositQuery extends BaseQuery {
private final String operator;
private final BaseQuery[] queries;
public CompositQuery(Long characteristicId, Operator operator, BaseQuery... queries) {
super(characteristicId);
this.operator = operator.value;
this.queries = queries;
}
...
}
等等
此模型的示例用法如下所示:
Set<BaseQuery> queries = new HashSet<>();
BaseQuery megapixelCharacteristicQuery = new CompositQuery(megapixelCharacteristic.getCharacteristicId(), CompositQuery.Operator.AND, new GreaterOrEqualQuery(megapixelCharacteristic.getCharacteristicId(), 10), new LessOrEqualQuery(megapixelCharacteristic.getCharacteristicId(), 50));
queries.add(megapixelCharacteristicQuery);
queries.add(new EqualQuery(androidCharacteristic.getCharacteristicId(), true));
Set<BaseQuery> queries
的序列化 JSON 对象看起来像:
[
{
"operator":"AND",
"queries":[
{
"value":10,
"comparisonOperator":"\u003e\u003d",
"characteristicId":391
},
{
"value":50,
"comparisonOperator":"\u003c\u003d",
"characteristicId":391
}
],
"characteristicId":391
},
{
"value":true,
"comparisonOperator":"\u003d",
"characteristicId":383
}
]
我必须将此或类似的 JSON 从客户端应用程序 (AngularJS) 传递到我的后端 REST API 端点,以便获得如上所述的正确反序列化模型(设置使用适当的条目,例如 CompositQuery
或 EqualQuery
).
现在,我的 Rest 控制器中的 Spring 应用程序后端逻辑无法使用适当的 类.
正确反序列化此 JSONSpring 中是否有任何方法可以为此 JSON 提供一些元信息(或其他信息)以帮助 Spring 正确反序列化此结构?
您可以在超类上使用 jackson 注释来实现此目的,如下所示:
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "javaclass")
@JsonSubTypes({
@Type(value = GreaterOrEqualQuery.class),
@Type(value = EqualQuery.class)
//and so on...
})
public abstract class BaseQuery {
...
}
这会将 javaclass
属性 添加到 json 表示中,这是 use = JsonTypeInfo.Id.CLASS
情况下的完全限定名称。为了简化此 属性 的值,请考虑 @JsonTypeInfo
的 use
参数的不同选项(例如 JsonTypeInfo.Id.NAME
)。