不同字段类型的 mapstruct 类型转换不起作用

mapstruct type conversion for different field types doesnt works

提问人:efe 提问时间:6/20/2023 最后编辑:Luca Basso Ricciefe 更新时间:6/20/2023 访问量:215

问:

在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 命名方法来转换,但无法完成此字段。

Java 嵌套 映射 mapstruct

评论


答:

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);
    }
}