如何使用 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 {
....
我有两个具有共同点的枚举 属性 - 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 {
....