将枚举值映射到类常量

问题描述 投票:0回答:1

在我们的代码库中,我们有很多伪枚举:

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 自动将枚举值映射到类常量?

它看起来不像这样一个特定的用例,但我在文档中没有找到任何线索。

java mapstruct
1个回答
0
投票

澄清什么是有效的是实现这一目标的唯一方法。 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 {

    //...
}
© www.soinside.com 2019 - 2024. All rights reserved.