MapStruct 问题映射对象到列表

时间:2021-04-22 09:56:32

标签: mapstruct

我有 MapStruct 1.4 的问题,在 Spring Boot 中使用不可迭代类型到 iterabel 类型。我收到此消息:错误:(21,13) java:限定符错误。没有找到注释的方法:[@ToList] 我使用这个例子:https://github.com/mapstruct/mapstruct-examples/pull/33/files

我还得到:考虑声明/实现映射方法:“列出映射(SourceObject 值)。从 SourceObject 到 TargetObject 的映射在单独的 Mapper 中。有什么问题?

请教我的课程。 带列表的父映射器:

@Mapper(config = CentralConfig.class,
        componentModel = "spring",
        uses = {NonIterableToIterable.class, CustomTargetChildMapperMapper.class},
        injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public abstract class CustomMapper extends BaseMapper<TargetObject> {
}

public abstract class BaseMapper<T> {
    @Mapping(target = "dataList", source = ".", qualifiedBy = ToList.class)
    public abstract T convert(SourceObject request);
}

列表的子项。

@Mapper(config = CentralConfig.class,
        componentModel = "spring",
        injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public abstract class CustomTargetChildMapperMapper extends BaseTargetChildMapper<TargetChildObject> {

}

public abstract class BaseTargetChildMapper<T> {
    @Mapping(target = "field1", source = "request.sourceField")
    public abstract T convert(SourceObject request);
}

用于列表映射的 Hepler 类

public class NonIterableToIterable {
    @ToList
    public <T> List<T> map(T in) {
        if (in != null) return Collections.singletonList(in);
        else return new ArrayList<T>();
    }
}

@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface ToList {
}

我很高兴得到帮助。

继承我的数据模型:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TargetObject_Type")
public class TargetObject {

    @XmlElement(name = "dataList")
    protected List<TargetChildObject> dataList;

    public List<TargetChildObject> getDataList() {
        if (dataList == null) {
            dataList = new ArrayList<TargetChildObject>();
        }
        return this.dataList;
    }
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TargetChildObject_Type")
public class TargetChildObject {

    @XmlElement(name = "field1")
    protected String field1;

     public String getField1() {
        return field1;
    }

    public void setField1(String value) {
        this.field1 = value;
    }
}

@Data
public class SourceObject {
    @ApiModelProperty(required = true, value = "Field one")
    @JsonProperty("sourceField")
    @JsonView(JsonViews.External.class)
    private String sourceField;
}

也许很重要,我也使用 lombok 版本 1.18.6。

马文:

<dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.4.2.Final</version>
        </dependency>

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.4.2.Final</version>
            <scope>provided</scope>
        </dependency>

....

 <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source> <!-- depending on your project -->
                    <target>1.8</target> <!-- depending on your project -->
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.6</version>
                        </path>
                        <!-- This is needed when using Lombok 1.18.16 and above -->
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok-mapstruct-binding</artifactId>
                            <version>0.2.0</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.4.2.Final</version>
                        </path>
                    </annotationProcessorPaths>
                    <compilerArgs>
                        <arg>
                            -Amapstruct.defaultComponentModel=spring
                            -Amapstruct.verbose=true
                        </arg>
                    </compilerArgs>
                </configuration>
            </plugin>



0 个答案:

没有答案
相关问题