java 如何对深度继承对象使用ModelMapper?

km0tfn4u  于 2023-01-24  发布在  Java
关注(0)|答案(3)|浏览(175)

** 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;
}

现在,当我以JSON形式返回类**AB**的示例时,它看起来像这样:

{
     "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

fafcakar

fafcakar1#

可能的解决办法:
1.你试过在父类中添加属性类型吗?如果你从数据库中检索这个字段,这就足够了。
1.一个简单的测试技巧,添加protected String type = this.getClass().getSimpleName().toLowerCase();。注意它必须是 * protected * 的。下面是我的测试代码:

@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");
 }
ymdaylpp

ymdaylpp2#

定义父类时可以使用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 {
yyyllmsg

yyyllmsg3#

现在有类型Map来解决这个问题。请参阅type-map-inheritence文档。

// Creates a base TypeMap with explicit mappings
TypeMap<BaseSrc, BaseDest> typeMap = modelMapper.createTypeMap(BaseSrc.class, BaseDest.class)
    .addMapping(BaseSrc::getFirstName, BaseDest::setName);

typeMap.include(SrcA.class, DestA.class)
    .include(SrcB.class, DestB.class)
    .include(SrcC.class, DestC.class);

相关问题