簡體   English   中英

如何 map 使用 MapStruct 的公共屬性將多個枚舉字符串(和返回)?

[英]How to map multiple enums to string (and back) using their common property with MapStruct?

我有兩個具有共同屬性的枚舉 - id:

public enum AccessLevel {
    PUBLIC("public"),PRIVATE("private");
    private String id;
}

public enum Status {
    SUCCESS("success"),TIMEOUT("timeout");
    private String id;
}

而且我需要此類枚舉的通用 MapStruct 映射(無需定義每個此類枚舉的映射)。

是的,可以通過 @TargetType 注釋來實現。 您需要此類枚舉的通用接口:

public interface IdEnum {
    String getId();
}

然后您需要能夠通過 id 創建此類接口實例的枚舉:

static <T extends Enum<T> & IdEnum> T getById(Class<T> enumClass, String id) {
    for (T e : enumClass.getEnumConstants()) {
        if (e.getId().equals(id)) {
            return e;
        }
    }
    throw new IllegalArgumentException("No enum const " + enumClass.getName() + " for id '" + id + "'");
}

那么泛型 Mapper 可能看起來像這樣(@TargetType 注解是成功的關鍵):

public class IdEnumMapper {

    public <T extends Enum<T> & IdEnum> T mapToEnum(String value, @TargetType Class<T> idEnumClass) {
        return IdEnum.getById(idEnumClass, value);
    }

    public String mapToString(IdEnum idEnum) {
        return idEnum.getId();
    }
}

只需使用它來映射包含此類枚舉的 class 的映射器:

@Mapper(uses = {IdEnumMapper.class})
public interface FilterMapper {
....

暫無
暫無

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

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