【问题标题】:How to use ModelMapper for deep inheritance objects?如何使用 ModelMapper 进行深度继承对象?
【发布时间】:2018-05-19 10:06:49
【问题描述】:

A.java

@Entity
@Getter
@Setter
@Inheritance
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, inclue=JsonTypeInfo.As.PROPERTY, property="type") 
@JsonSubTypes({
    @JsonSubTypes.Type(value=AA.class,name="aa"),
    @JsonSubTypes.Type(value=AB.class,name="ab"),
})
public abstract class A {
    @Id
    @GeneratedValue
    private Long id;

    //json ignore for getter
    @ManyToOne
    private A parent;

    @OneToMany(mappedBy="parent")
    private List<A> children;
}

AA.java

@Entity
@Getter
@Setter
@DiscriminatorValue("aa")
public class AA extends A{
    private User user;
}

AB.java

@Entity
@Getter
@Setter
@DiscriminatorValue("ab")
public class AB extends A {
    private String name;
}

现在,当我将 AB 类的实例作为 JSON 返回时,它看起来像这样:

{
     "id": 1,
     "type": "ab",
     "children": [...],
     "name": "ali"
}

由于我想使用自定义的User JSON,我想使用ModelMapper。除了没有type之外,一切都很好。

我的 DTO:

@Getter
@Setter
public class ADto {
     private Long id;

     private List<ADto> children;
}

@Getter
@Setter
public class AADto extends ADto {
     private UserDto user;
}

@Getter
@Setter
public class ABDto extends ADto {
     private String name;
}

如何使用ModelMapper 并获得type 的类?

【问题讨论】:

  • 你确定这个例子是正确的吗?例如,AB 没有在任何地方使用,它只有一个字段,但它的 json 有 4 个字段。您能否重新格式化/简化您的问题,以便清楚您需要什么。
  • @OleksandrShpota 你是对的,AAAB 扩展类 A

标签: java dto modelmapper


【解决方案1】:

可能的解决方案:

  1. 您是否尝试在父类中添加属性类型?如果您从数据库中检索此字段,这应该足够了。
  2. 一个简单的测试技巧,添加protected String type = this.getClass().getSimpleName().toLowerCase();。请注意,它必须是受保护的。这是我测试过的代码:

    @Data
    abstract class A {
      protected String type = this.getClass().getSimpleName().toLowerCase();
    }
    
     class AB extends A {}
    
     class AA extends A {}
    
     @Test
     public void test(){
        A a1 = new AB();
        A a2 = new AA();
        assertThat(a1.getType()).isEqualTo("ab");
        assertThat(a2.getType()).isEqualTo("aa");
     }
    

【讨论】:

    【解决方案2】:

    您可以在定义父类时使用 InheritanceType,这将有助于显示类的子类型

    前- A.java

    @Entity
    @Getter
    @Setter
    @Inheritance(strategy=InheritanceType.JOINED) // change needed 
    @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, inclue=JsonTypeInfo.As.PROPERTY, property="type") 
    @JsonSubTypes({
        @JsonSubTypes.Type(value=AA.class,name="aa"),
        @JsonSubTypes.Type(value=AB.class,name="ab"),
    })
    public abstract class A {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      相关资源
      最近更新 更多