我在尝试从整数值映射到 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/