JsonSubtype 属性 值与抽象 class 变量名相同
JsonSubtype property value same as abstract class variable name
抱歉,标题令人困惑。我正在为我最近的一个项目使用 JsonSubTypes
。
请考虑以下片段:
@NoArgsConstructor
@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "memberType")
@JsonSubTypes({
@JsonSubTypes.Type(name = UserType.AGENT_TEXT, value = Agent.class),
@JsonSubTypes.Type(name = UserType.CUSTOMER_TEXT, value = Customer.class),
@JsonSubTypes.Type(name = UserType.GUEST_TEXT, value = Guest.class)})
public abstract class User {
private UserType memberType;
public User(UserType memberType) {
this.memberType = memberType;
}
public abstract <T> T accept(UserVisitor<T> visitor);
public abstract SomeObject buildAndGetSomeObject();
}
和派生的具体 class,代码注释中提到错误:
@Data
@NoArgsConstructor
public class Customer extends User {
private CustomerData userData;
public Customer(CustomerData userData) {
super( UserType.CUSTOMER);
this.userData = userData;
}
@Override
public <T> T accept(UserVisitor<T> visitor) {
return visitor.visit(this);
}
@Override
public SomeObject buildAndGetSomeObject() {
return SomeObject.builder()
.userType(getMemberType()) // getMemberType() here is null when ideally it should be CUSTOMER
.build();
}
}
现在,此代码适用于以下负载:
{
"User": {
"memberType": "CUSTOMER",
"memberType": "CUSTOMER",
"userData": {
"hashedId": "21039cefba8a499e85d62656cbandvcs234",
"name": "******4321",
"memberType": "CUSTOMER"
}
},
}
注意 memberType
是如何通过两次但同样失败的,单次出现如下:
{
"User": {
"memberType": "CUSTOMER",
"userData": {
"hashedId": "21039cefba8a499e85d62656cbandvcs234",
"name": "******4321",
"memberType": "CUSTOMER"
}
},
}
我想了解这里的方法/设计可能有什么问题?
如果我在 Customer
class 中重写 getMemberType()
并进行硬编码 return,它会工作正常,但这样它就无法实现继承的目的。
我的假设是它与 property = "memberType"
和 memberType
变量名称相同有关。
感谢任何帮助。
这是在带有 maven 的 dropwizard 应用程序中
解决方案是在构造函数上使用 @JsonCreator
。似乎 JsonSubTypes
默认调用 NoArgsConstructor
来构建对象。
设置 JsonCreator
时,构造函数被正确调用
@JsonCreator // voila
@Builder
public Customer(CustomerData userData) {
super( UserType.CUSTOMER);
this.userData = userData;
}
抱歉,标题令人困惑。我正在为我最近的一个项目使用 JsonSubTypes
。
请考虑以下片段:
@NoArgsConstructor
@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "memberType")
@JsonSubTypes({
@JsonSubTypes.Type(name = UserType.AGENT_TEXT, value = Agent.class),
@JsonSubTypes.Type(name = UserType.CUSTOMER_TEXT, value = Customer.class),
@JsonSubTypes.Type(name = UserType.GUEST_TEXT, value = Guest.class)})
public abstract class User {
private UserType memberType;
public User(UserType memberType) {
this.memberType = memberType;
}
public abstract <T> T accept(UserVisitor<T> visitor);
public abstract SomeObject buildAndGetSomeObject();
}
和派生的具体 class,代码注释中提到错误:
@Data
@NoArgsConstructor
public class Customer extends User {
private CustomerData userData;
public Customer(CustomerData userData) {
super( UserType.CUSTOMER);
this.userData = userData;
}
@Override
public <T> T accept(UserVisitor<T> visitor) {
return visitor.visit(this);
}
@Override
public SomeObject buildAndGetSomeObject() {
return SomeObject.builder()
.userType(getMemberType()) // getMemberType() here is null when ideally it should be CUSTOMER
.build();
}
}
现在,此代码适用于以下负载:
{
"User": {
"memberType": "CUSTOMER",
"memberType": "CUSTOMER",
"userData": {
"hashedId": "21039cefba8a499e85d62656cbandvcs234",
"name": "******4321",
"memberType": "CUSTOMER"
}
},
}
注意 memberType
是如何通过两次但同样失败的,单次出现如下:
{
"User": {
"memberType": "CUSTOMER",
"userData": {
"hashedId": "21039cefba8a499e85d62656cbandvcs234",
"name": "******4321",
"memberType": "CUSTOMER"
}
},
}
我想了解这里的方法/设计可能有什么问题?
如果我在 Customer
class 中重写 getMemberType()
并进行硬编码 return,它会工作正常,但这样它就无法实现继承的目的。
我的假设是它与 property = "memberType"
和 memberType
变量名称相同有关。
感谢任何帮助。
这是在带有 maven 的 dropwizard 应用程序中
解决方案是在构造函数上使用 @JsonCreator
。似乎 JsonSubTypes
默认调用 NoArgsConstructor
来构建对象。
设置 JsonCreator
时,构造函数被正确调用
@JsonCreator // voila
@Builder
public Customer(CustomerData userData) {
super( UserType.CUSTOMER);
this.userData = userData;
}