我有 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>