簡體   English   中英

Java Mapstruct 通用枚舉轉換器

[英]Java Mapstruct generic enum converter

我有兩個不同的枚舉類,其中一個將它們用作一個值

public enum Type{

    TEST1{
        @Override
        public Type convertToINT() {
            return Type.INTEGRATION1;
        }
    },
    TEST2{
        @Override
        public Type convertToINT() {
            return Type.INTEGRATION2;
        }
    },
    TEST3{
        @Override
        public TypeIntegration convertToINT(){
            return Type.INTEGRATION3;
        }
    };

   public abstract TypeIntegration convertToINT();
}


public enum TypeIntegration {

    INTEGRATION1,
    INTEGRATION2,
    INTEGRATION3
}

例如,這個枚舉在不同的類中使用;

@Getter
@Setter
public class typeSaveReqDto{
 private blabla;
 private blabla;
 private Type type;
}


@Getter
@Setter
public class typeIntegrationObject{
 private blabla;
 private blabla
 private TypeIntegration type;
}

我想使用 mapstructs 並通過自動生成的類進行轉換,但 mapstruct 向我拋出異常,例如“屬性“類型類型”枚舉中的以下常量在“類型集成類型”枚舉中沒有對應的常量,必須通過添加附加映射來映射:TEST1、TEST2、TEST3"

我想創建用於轉換枚舉的 EnumMapper 類,如何使用 mapStructs java 編寫通用類?

編輯 :

我生成了 EnumMapper

@Mapper
public class EnumMapper {

    EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class);

    @Named("enumToIntEnum")
    public static <T extends EnumConverter<INT>,INT> INT convertToINT(T enums, @TargetType INT enumClass){
        INT convertObj = ((T)enums).convertToINT();
        return convertObj;
    }
}

和 Mapper 接口如下

@Mapper(componentModel = "spring",uses = EnumMapper.class)
public interface TypeReqMapper {

    
        @Mapping(source = "type" , target = "type",qualifiedByName = "enumToIntEnum")
    public TypeIntegrationObject typeSaveReqDtoTotypeIntegrationObject(TypeSaveReqDto typeSaveReqDto);

}

但是我遇到了一個失敗,比如“無法將屬性“類型類型”映射到“類型集成類型”。 考慮聲明/實現一個映射方法:“TypeIntegration map(Type value)”。

類型T未知且不包含convertToINT方法,因為它可以是任何東西。 所以保持簡單,只寫一個專用的映射器,而不是嘗試構建一個可以做所有事情的映射器。

@Mapper(componentModel="spring")
public class TypeToTypeIntegrationMapper {

  @Mapping
  public TypeIntegration map(Type from) {
    return from.convertToINT();
  }
}

不要讓它變得更復雜。

您甚至可以放棄映射器並改為編寫expression

@Mapper(componentModel = "spring",uses = EnumMapper.class)
public interface TypeReqMapper {

    
        @Mapping(source = "type" , target = "type", expression = "java(type.convertToINT())")
    public TypeIntegrationObject typeSaveReqDtoTotypeIntegrationObject(TypeSaveReqDto typeSaveReqDto);

}

MapStruct 現在將使用表達式來生成映射代碼,而不必自己編寫映射器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM