当前位置: 首页 > 知识库问答 >
问题:

如何将多个枚举映射到字符串(和回)使用它们的公共属性与MapSTRt?

阎丰羽
2023-03-14

我有两个具有公共属性-id的枚举:

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

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

我需要此类枚举的通用MapStruct映射(无需定义每个此类枚举的映射)。

共有1个答案

阳修永
2023-03-14

是的,可以通过@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 + "'");
}

那么泛型映射器可能看起来像这样(@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();
    }
}

只需将其用于映射包含此类枚举的类的映射器:

@Mapper(uses = {IdEnumMapper.class})
public interface FilterMapper {
....
 类似资料:
  • 问题内容: 我有一个类别hibernate模型: 其中有一个类型字符串字段。我也有一个Java枚举,它表示类别的类型: 我想用它代替字符串类型。SQL在varchar参数中接受两个不同的值:或。我希望Category模型类接受一个枚举变量- 每当hibernate要求它时,都以某种方式将其映射到字符串。 可能吗? 问题答案: 是的,有可能。它应该是:

  • 我有一个类别Hibernate模型: 它们具有类型字符串字段。另外,我还有一个Java枚举,它表示类别的一种类型:

  • 问题内容: 我有一个类别休眠模型: 其中有一个类型字符串字段。我也有一个Java枚举,它表示类别的类型: 我想用它代替字符串类型。SQL在varchar参数中接受两个不同的值:或。我希望Category模型类接受一个枚举变量- 并在休眠要求时以某种方式将其映射到字符串。 可能吗? 问题答案: 是的,有可能。它应该是:

  • 我正在使用以下代码来包含枚举值和与之关联的相应字符串。我想知道是否有更简单的方法来实现这一点?

  • 问题内容: 我想在打字稿中使用字符串枚举,但在其中看不到对反向映射的支持。我有一个这样的枚举: 我需要这样使用它: 是的,我不知道字符串中有什么,如果字符串未在枚举定义中显示,我需要将其解析为枚举或在运行时解析失败。我该如何做到整洁呢?提前致谢 问题答案: 我们可以将其设为一个类型,并将值设为同一类型。 更严格的版本: 字符串枚举作为此答案: