提问人:efe 提问时间:6/20/2023 最后编辑:Luca Basso Ricciefe 更新时间:6/20/2023 访问量:215
不同字段类型的 mapstruct 类型转换不起作用
mapstruct type conversion for different field types doesnt works
问:
在quarkus项目中,我尝试使用MapStruct 1.5.5.Final版本映射DataSyncConfigurationMapping和DataSyncConfigurationMappingEntity,除了columnNames/columnNameList字段,其他字段类型匹配,并且在测试时,其他字段映射工作顺利。我错过了什么,有什么帮助吗?
public class DataSyncConfigurationMappingEntity{
private Long id;
private String columnNames;
private String oldValue;
private String newValue;
private DataSyncConfigurationEntity dataSyncConfiguration;
}
public class DataSyncConfigurationMapping{
private Long id;
private List<String> columnNameList;
private String oldValue;
private String newValue;
private DataSyncConfiguration dataSyncConfiguration;
}
public class DataSyncConfigurationEntity{
private Long id;
private String name;
private String fileName;
private String sqlStatement;
private String columnNames;
private String cron;
}
public class DataSyncConfiguration{
private Long id;
private String name;
private String fileName;
private String sqlStatement;
private List<String> columnNameList;
private String cron;
}
@Mapper(componentModel = "jakarta", uses = {DataSyncConfigurationMapper.class})
public interface DataSyncConfigurationMappingMapper {
@Mapping(source = "dataSyncConfiguration.columnNames", target = "dataSyncConfiguration.columnNameList",
qualifiedByName = "stringToListConverter")
DataSyncConfigurationMapping entityToPojo(DataSyncConfigurationMappingEntity entity);
@Mapping(source = "dataSyncConfiguration.columnNameList", target = "dataSyncConfiguration.columnNames",
qualifiedByName = "listToStringConverter")
DataSyncConfigurationMappingEntity pojoToEntity(DataSyncConfigurationMapping pojo);
@Named("stringToListConverter")
default List<String> map(String value) {
return stringToList(value);
}
@Named("listToStringConverter")
default String map(List<String> list) {
return listToString(list);
}
}
@Mapper(componentModel = "jakarta")
public interface DataSyncConfigurationMapper {
@Mapping(source = "columnNames", target = "columnNameList")
DataSyncConfiguration entityToPojo(DataSyncConfigurationEntity entity);
@Mapping(source = "columnNameList", target = "columnNames")
DataSyncConfigurationEntity pojoToEntity(DataSyncConfiguration pojo);
default List<String> map(String value){
return stringToList(value);
}
default String map(List<String> list){
return listToString(list);
}
}
@ApplicationScoped
public class MapperUtils {
public static List<String> stringToList(String columnNames) {
if (columnNames == null) {
return null;
} return Arrays.asList(columnNames.split(","));
}
public static String listToString(List<String> list) {
if (list == null) {
return null;
}
return String.join(",", list);
}
}
@QuarkusTest
public class DataSyncConfigurationMappingMapperTest {
@Inject
DataSyncConfigurationMappingMapper dataSyncConfigurationMappingMapper;
@Test
public void testEntityToPojo() {
DataSyncConfigurationMappingEntity entity = new DataSyncConfigurationMappingEntity();
entity.setColumnNames("column1,column2,column3");
entity.setOldValue("name");
DataSyncConfigurationEntity dataSyncConfigurationEntity = new DataSyncConfigurationEntity();
dataSyncConfigurationEntity.setName("sss");
dataSyncConfigurationEntity.setColumnNames("a1,b2,c3");
entity.setDataSyncConfiguration(dataSyncConfigurationEntity);
DataSyncConfigurationMapping pojo = dataSyncConfigurationMappingMapper.entityToPojo(entity);
assertEquals(entity.getId(), pojo.getId());
assertEquals(Arrays.asList(entity.getColumnNames().split(",")), pojo.getColumnNameList());
assertNotNull(pojo.getDataSyncConfiguration());
assertEquals(dataSyncConfigurationEntity.getName(), pojo.getDataSyncConfiguration().getName());
assertEquals(Arrays.asList(dataSyncConfigurationEntity.getColumnNames().split(",")), pojo.getDataSyncConfiguration().getColumnNameList());
}
}
就像我在代码中提到的那样,我尝试使用 stringToListConverter 和 listToStringConverter 命名方法来转换,但无法完成此字段。
答:
1赞
Azadi Yazdani
6/20/2023
#1
我对您的 Mappers 进行了一些更改,它们起作用了:
1- 使用“spring”而不是“jakarta”作为 @Mapper 中的组件模型
2- 使用抽象类而不是映射器的接口
3-删除DataSyncConfigurationMappingMapper中多余的命名方法
这些是我更改的类:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.springframework.stereotype.Component;
@Component
@Mapper(componentModel = "spring", uses = {DataSyncConfigurationMapper.class})
public abstract class DataSyncConfigurationMappingMapper {
@Mapping(source = "columnNames", target = "columnNameList",
qualifiedByName = "stringToListConverter")
public abstract DataSyncConfigurationMapping entityToPojo(DataSyncConfigurationMappingEntity entity);
@Mapping(source = "columnNameList", target = "columnNames",
qualifiedByName = "listToStringConverter")
public abstract DataSyncConfigurationMappingEntity pojoToEntity(DataSyncConfigurationMapping pojo);
}
和 DataSyncConfigurationMapper
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import java.util.List;
import static com.thunder.light.model.mapstruct.MapperUtils.listToString;
import static com.thunder.light.model.mapstruct.MapperUtils.stringToList;
@Mapper(componentModel = "spring")
public abstract class DataSyncConfigurationMapper {
@Mapping(source = "columnNames", target = "columnNameList", qualifiedByName = "stringToListConverter")
public abstract DataSyncConfiguration entityToPojo(DataSyncConfigurationEntity entity);
@Mapping(source = "columnNameList", target = "columnNames", qualifiedByName = "listToStringConverter")
public abstract DataSyncConfigurationEntity pojoToEntity(DataSyncConfiguration pojo);
@Named("stringToListConverter")
public List<String> map(String value){
return stringToList(value);
}
@Named("listToStringConverter")
public String map(List<String> list){
return listToString(list);
}
}
评论