Вам необходимо указать 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);
}
}
Убедитесь, что я создал метод карты, в котором я скажите mapstruct, как преобразовать int в EnumStates. Используя метод преобразования, который вы создали внутри перечисления.
Я упростил классы моделей, поскольку в этом примере я не использую ломбок или базу данных. Это почти тот же код, что и ваш, я не менял никаких логи c.
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;
}
}
Надеюсь, это решит вашу проблему, дайте мне знать, если возникнут сомнения.