在我们的代码库中,我们有很多伪枚举:
public final class Target extends PseudoEnum {
public static final ErrorCode FOO = new ErrorCode(1);
public static final ErrorCode BAR = new ErrorCode(2);
private Target(int value) {
super(value);
}
}
我正在尝试使用 MapStruct 将这些伪枚举映射到枚举值,反之亦然。
public enum Source {
FOO, BAR
}
以下内容不起作用,因为目标不是枚举:
@Mapper
public interface SourceMapper {
@ValueMapping(target = "FOO", source = "FOO")
@ValueMapping(target = "BAR", source = "BAR")
Target map(Source source);
}
以下方法有效:
@Mapper
public interface SourceMapper {
Map<Source, Target> MAPPING = Map.of(
Source.FOO, Target.FOO,
Source.BAR, Target.BAR
);
default Target map(Source source) {
return MAPPING.get(source);
}
}
不过,我对它没有真正的兴趣,因为我最终编写了所有映射代码。
有没有办法让 MapStruct 自动将枚举值映射到类常量?
它看起来不像这样一个特定的用例,但我在文档中没有找到任何线索。
澄清什么是有效的是实现这一目标的唯一方法。 MapStruct 允许从
Enum
到 Enum
、Enum
到 String
以及 String
到 Enum
的值映射。 MapStruct 不支持从 Enum
映射到类中的某个任意最终字段。
最好的解决方案是使用一个静态 util 类来执行此映射。
例如
public class SourceTargetUtils {
private final Map<Source, Target> MAPPING = Map.of(
Source.FOO, Target.FOO,
Source.BAR, Target.BAR
);
public static Target getTarget(Source source) {
return source == null ? null : MAPPING.get(source);
}
}
这样做你就可以在其他映射器中使用这个
SourceTargetUtils
。
例如
@Mapper(uses = SourceTargetUtils.class)
public interface MyOtherMapper {
//...
}