java - 无法使用 MapStruct 映射 Integer 中的枚举

标签 java enums mapstruct

我在尝试从整数值映射到 ENUM 时遇到问题,我的方法映射它:

@Mapping(
      target = "myModel.states",// this is my ENUM
      source = "source.stateId") // this is the Integer Value
  ClsTargetModel mapCreditCard(ClsMyClass source);

ENUM 和实体模型:

实体:

@Getter
@Setter
@Entity
@Table(name = "my_table")
public class MyEntityModel {
  @Id
  @Column(name = "id")
  private Integer id;

  @Basic
  @Column(name = "description")
  private String description;
}

枚举:

@Getter
@ToString
public enum EnumStates {
  STATE1(1),
  STATE2(2),
  STATE3(3);

  public Integer id;

  EnumStates(Integer id) {
    this.id = id;
  }

  public static EnumStates getStateById(Integer stateId) {
    return Arrays.stream(EnumStates.values())
        .filter(enumStateValue -> enumStateValue.id == stateId)
        .findFirst()
        .orElse(null);
  }
}

当我尝试将 ID 从模型实体映射到 ENUM 时,mapstruct 显示错误:

error: Can't map property "java.lang.Integer Id" to "EnumStates states". Consider to declare/implement a mapping method: "EnumStates map(java.lang.Integer value)".

我认为该方法是在枚举中声明的,但是 mapstruct 总是响应该错误,请检查我的代码好吗?

最佳答案

您需要告诉 mapstruct 如何将整数值映射到您的枚举。

一个可能的解决方案是:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

@Mapper
public interface ClsMapper {

    @Mapping(
            target = "states",// this is my ENUM
            source = "id") //
    ClsTargetModel to(ClsMyClass clsMyClass);

    default EnumStates map(int value) {
        return EnumStates.getStateById(value);
    }
}

检查我是否创建了一个 map 方法,我在其中告诉 mapstruct 如何将 int 转换为 EnumStates。使用您在枚举中创建的转换方法。

我已经简化了模型类,因为我没有在这个例子中使用 lombok 或数据库。它与您的代码几乎相同,我没有更改任何逻辑。

public class ClsMyClass {
    private int id;
    private String description;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}
public class ClsTargetModel {
    private EnumStates states;

    public EnumStates getStates() {
        return states;
    }

    public void setStates(EnumStates states) {
        this.states = states;
    }
}
public enum EnumStates {
    STATE1(1),
    STATE2(2),
    STATE3(3);

    public Integer id;

    EnumStates(Integer id) {
        this.id = id;
    }

    public static EnumStates getStateById(Integer stateId) {
        return Arrays.stream(EnumStates.values())
                .filter(enumStateValue -> enumStateValue.id == stateId)
                .findFirst()
                .orElse(null);
    }
}

然后 mapstruct 自动生成一个映射器代码,如:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2020-07-26T14:31:58+0200",
    comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_144 (Oracle Corporation)"
)
public class ClsMapperImpl implements ClsMapper {

    @Override
    public ClsTargetModel to(ClsMyClass clsMyClass) {
        if ( clsMyClass == null ) {
            return null;
        }

        ClsTargetModel clsTargetModel = new ClsTargetModel();

        clsTargetModel.setStates( map( clsMyClass.getId() ) );

        return clsTargetModel;
    }
}

希望这能解决您的问题,如有任何疑问,请告诉我。

关于java - 无法使用 MapStruct 映射 Integer 中的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62899922/

相关文章:

c# - 通用枚举到 SelectList 扩展方法

java - 强制子类声明枚举

java - 从mapstruct收到错误 "Several possible source properties for target property"时如何避免显式映射?

java - 将 Infinispan 配置为 Hibernate 的远程二级缓存

java - 运行 java servlet 时出现 Classnotfoundexception

php - Laravel Php 8.1 如何将枚举案例转换为数组以选择输入

java - MapStruct 不会通过 Spring-boot 测试 Gradle Junit5 自动写入

java - Mapstruct - 从多个集合映射到单个集合

java - 带有 java.util.ArrayList 和 "Enum"的异常错误消息

java - 仅打印字符串的特定部分