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;

}