无法使用 MapStruct 从 Integer 映射 Enum

Edw*_*Cab 3 java enums mapstruct

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

枚举:

@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);
  }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试将 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)".
Run Code Online (Sandbox Code Playgroud)

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

小智 8

您需要告诉 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

检查我是否创建了一个 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;
    }
}
Run Code Online (Sandbox Code Playgroud)
public class ClsTargetModel {
    private EnumStates states;

    public EnumStates getStates() {
        return states;
    }

    public void setStates(EnumStates states) {
        this.states = states;
    }
}
Run Code Online (Sandbox Code Playgroud)
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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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