当我试图用一个私有的默认构造函数映射对象时,MapStruct无法创建一个实现,而是使用一个(lombok生成的)构建器。
@Value
@Builder
public class SomeDto {
}
@Value
@Builder
public class SomeModel {
}
@Mapper
public interface SomeMapper {
SomeDto map(SomeModel someModel);
SomeModel map(SomeDto someDto);
}
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</path>
<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.1.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2021-01-29T13:47:46+0100",
comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11.0.9.1 (Ubuntu)"
)
public class SomeMapperImpl implements SomeMapper {
@Override
public SomeDto map(SomeModel someModel) {
if ( someModel == null ) {
return null;
}
SomeDto someDto = new SomeDto();
return someDto;
}
@Override
public SomeModel map(SomeDto someDto) {
if ( someDto == null ) {
return null;
}
SomeModel someModel = new SomeModel();
return someModel;
}
}
为了重现这个问题,复制这个repo https://github.com/rmvanderspek/mapstruct-demo和mvn verify。
我已经使用了您的演示源码,结果发现将Mapstruct放在编译器插件源码中可以解决这个问题。我不知道为什么这样做,这对我来说是违反直觉的,但这是Mapstruct的一名开发人员在Lombok的GitHub上发布的类似问题中提出的建议。
所以在你的情况下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.mapstruct-processor.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${org.projectlombok.ombok-mapstruct-binding.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
问题内容: 如果名称和名称相同,默认情况下MapStruct将映射源和目标的所有属性。尽管我们可以在@Mapping中使用ignore属性来省略任何字段映射。但这不是我想要的。我想控制映射策略。我必须指定类似 现在此映射仅用于将ID和名称从源映射到目标。除非在映射注释中指定,否则不应映射其他字段。 问题答案: 您正在寻找的是#1392中 的功能请求。有一个待定的PR,因此可以在下一版本(1.3.0
默认情况下,MapStruct映射源和目标的所有属性,如果它们具有相同的名称。中的元素可用于省略任何字段映射。但那不是我想要的。我想控制映射策略。我想指定如下内容: 现在,这个映射仅仅意味着将id和名称从源映射到目的地。除非在mappings注释中指定,否则不应映射其他字段。
我有简单的对象客户端
我的映射器: parsedunsignedshort 所以你可以在上面看到触发器在“源”中是一个ParsedUnsignedShort,在“目标”中是一个Long。在我得到这个的时候,有一个名字冲突: 错误:(42,6)Java:无法将属性“cat.tmatic.mh.domain.pl6xx.ParseDunSignedShort触发器”映射到“java.lang.Long触发器”。考虑声明/实
Android Studio正在使用这个JDK位置:C:\Program Files\Android\Android Studio\JRE,这与Gradle默认使用的不同:C:\Program Files(x86)\Java\JDK1.8.0_181如果使用Android Studio从命令行运行Gradle任务,使用不同的位置可能会产生多个Gradle守护进程。 然后给出了这些选项: 详细信息.
这是我的例子。 我希望toDto方法使用toDto将Employee映射到EmployeeDto,但mapstruct会生成employeeDtoToEmployeeDto方法。我该怎么修? 谢谢