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)
我希望这能解决您的问题,如有任何疑问,请告诉我。
| 归档时间: |
|
| 查看次数: |
12429 次 |
| 最近记录: |