MapStruct是一个代码生成器,用于在Java中创建高效,类型安全的bean-to-bean映射。
我有以下xml 我必须映射到包含所有属性的单个实例。如您所见,属性名称是唯一的,因此所有这些数组都可以映射到一个实例: public class FilteredDE { protected String AA001; ... protected String AA009; protected String AA011; ... protected String AA019; protected String AB001; ... 创建的JAXB类Record看起来相似,它包含所有属性名称,但只有这些属性是XML中存在的。 在第一个记录中,AA001,...,AA009,在第二个AA011,...,AA019等 制作了以下映射器: @Mapping(target = ".", source = "group") public FilteredDE map(Result re); @Mapping(target = ".", source = "record") public FilteredDE map(Group re, @MappingTarget FilteredDE filt); public FilteredDE map(Record re, @MappingTarget FilteredDE filt); 我想将同一实例传递给每个映射器,因此最后一个实例将被所有属性值填充。 如何互相调用map方法,因此实例之间没有传递: @Override public FilteredDE map(Result re) { if ( re == null ) { return null; } FilteredDE.FilteredDEBuilder filteredDE = FilteredDE.builder(); return filteredDE.build(); } @Override public FilteredDE map(Group re, FilteredDE filt) { if ( re == null ) { return filt; } return filt; } @Override public FilteredDE map(Record re, FilteredDE filt) { if ( re == null ) { return filt; } if ( re.getAA001() != null ) { filt.setAA001( re.getAA001() ); } ... if ( re.getAZ029() != null ) { filt.setAZ029( re.getAZ029() ); } return filt; 任何暗示我如何在地图结构中实现这一目标?可以吗? thanks! 可能不是最好的解决方案,但它足够紧凑,这是我最终写的: public FilteredDE map(Result re) { FilteredDE filteredDE = new FilteredDE(); for (Group group : re.getGroup()) { for (Record record : block.getRecord()) { map(record, filteredDE); } } return filteredDE; } @BeanMapping( nullValuePropertyMappingStrategy= NullValuePropertyMappingStrategy.IGNORE, nullValueCheckStrategy=NullValueCheckStrategy.ALWAYS) public abstract FilteredDE map(Record re, @MappingTarget FilteredDE filt); 请问更好吗?
从ArrayList检索图形结构 我正在尝试使用映射映射两个对象。我已经搜索了一段时间,尽管我是对编程的新手,但我找不到任何东西,所以我敢肯定这比我要做的容易。
这里是一些剥离的后代代码(请注意,实际代码更复杂,来自ArrayList的子对象与目标对象的类型不与目的对象的儿童变量相同):
MapStruct 映射器在 Spring Boot 中无法正确映射嵌套 DTO
我有一个无法与映射一起使用的 DTO @数据 公共类IndividualDTO { private String 护照号码; 私有字符串电话号码; 私有 UserDTO 用户; @数据 公开
Mapstruct Mapper 返回未初始化的 Spring Bean
我有一个Mapper类WishListMapper,如下所示: @Mapper(componentModel = MappingConstants.ComponentModel.SPRING) 公共抽象类 WishListMapper { @映射({ @Mapping(来源= &q...
MapStruct 不生成 Mapper 实现/空生成的文件夹 - 普通 Eclipse + Java 8
由于我在 Stackoverflow 和 MapStruct-Users Group/Github 讨论中进行了长时间的研究后都找不到我的问题的任何答案,所以我再次将其发布在这里。 我们开始使用 MapStru...
使用 Mapstruct 时,我可以使用 @TargetType 注释检索目标字段的类,如下所示: > T mapToEnum(字符串输入,@TargetType Class
我在Spring Boot应用程序中使用mapstring @Mapper(componentModel = "spring", use = { PubMapper.class, IsbnMapper.class}) 公共接口 DepotMapper { @Mapping(目标 = "id...
我想给mapstruct生成的~impl文件中的list.add条件。我该怎么办?
我想知道在使用mapstruct将实体转换为dto时是否可以应用条件表达式。 房产的搜索结果有很多,但是好奇的时候却找不到。 在
如何使用 MapStruct 将属性设置为当前 OffsetDateTime(现在)?
我正在尝试使用 MapStruct 来映射类上的属性,这些属性中有一个 OffetDateTime 变量,我需要将其设置为当前时间。 然而,当MapperImpl类被生成时...
我想在我的项目中使用Map Struct,但是当我在maven-compiler-plugin中实现它时,其他所有annotationProcessorPaths都从项目中删除了(最重要的是Lombok)。但几个小时后...
我从事电子商务系统,我设计实体作为超类和子类关系使用 @Inheritance(策略 = InheritanceType.JOINED) 这样子类实体就会扩展...
我正在将Mapstruct和Lombok与maven和IDEA一起使用,它拒绝生成映射器实现。配置: 我将 Mapstruct 和 Lombok 与 maven 和 IDEA 一起使用,但它拒绝生成映射器实现。配置: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> ... <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <java.version>11</java.version> <org.mapstruct.version>1.3.0.Beta2</org.mapstruct.version> <lombok.version>1.18.2</lombok.version> </properties> <dependencies> <!-- spring deps --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> ... <!-- lombok dep --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${org.mapstruct.version}</version> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <executions> <execution> <id>add-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>${project.build.directory}/generated-sources/java/</source> <source>${project.build.directory}/generated-sources/annotations/</source> </sources> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <release>11</release> <annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> <configuration> <archive> <manifestEntries> <Implementation-Version>${project.version}</Implementation-Version> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build> ... </project> Mapstruct 和 Lombok 都用 idea 注册为注释处理器: 当我尝试使用 IDEA 构建或尝试 maven clean install 时,不会生成实现文件。 我尝试将Java从11更改为8,但仍然不起作用。 /target/ generated-sources/annotations 只是空的。具有相同配置的其他项目运行良好。 添加mapstruct-processor依赖项为我解决了这个问题。 问题是我的映射器缺少注释@Mapper。 如果你使用kotlin,则需要使用kapt而不是annotationProcessor Gradle 示例: plugins { kotlin("kapt") version "1.4.32" } ... dependencies { ... implementation("org.mapstruct:mapstruct:1.4.2.Final") kapt("org.mapstruct:mapstruct-processor:1.4.2.Final") } 之后,如果执行gradle build,就会生成实现 对我来说问题是: <useIncrementalCompilation>false</useIncrementalCompilation> 注释掉后,一切正常! <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${jdk.target.version}</source> <target>${jdk.target.version}</target> <!--<useIncrementalCompilation>false</useIncrementalCompilation>--> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> 如果您将 Kotlin 与 Maven 结合使用,则可以添加以下依赖项: <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> </dependency> 并将 kapt 执行添加到 kotlin-maven-plugin 中,如下所示: <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>1.5.0</version> <executions> <execution> <id>kapt</id> <goals> <goal>kapt</goal> </goals> <configuration> <sourceDirs> <sourceDir>src/main/kotlin</sourceDir> <sourceDir>src/main/java</sourceDir> </sourceDirs> <annotationProcessorPaths> <!-- Specify your annotation processors here. --> <annotationProcessorPath> <groupId>com.google.dagger</groupId> <artifactId>dagger-compiler</artifactId> <version>2.9</version> </annotationProcessorPath> </annotationProcessorPaths> </configuration> </execution> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>test-compile</id> <phase>test-compile</phase> <goals> <goal>test-compile</goal> </goals> </execution> </executions> </plugin> 我也遇到过这个问题。就我而言,出现此错误: Java:由于错误元素存在问题,没有为 Mapper 创建实现 当应用程序运行时。 我曾经使用Spring Boot版本2.4.3当我将版本降低到2.2.6.RELEASE时它开始工作 尝试属性> Maven >注释处理>(启用)自动配置JDT APT。 我已经尝试了这里的所有内容,但没有任何效果,所以我复制了实际上在那里工作的 pom.xml,我发现我们必须在构建标记之后添加此配置。 然后编译,会在目标文件夹生成Mapper Impl类 <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
为什么 MapStruct Processor 有时会作为 Maven 插件而不是依赖项添加?
说明: 我注意到官方 MapStruct 文档和有关如何配置映射结构处理器的各种教程之间存在差异。在一些教程中,地图结构处理器...
MapStruct NullValuePropertyMappingStrategy.IGNORE 将空布尔值重置为 false?
使用 MapStruct 的文档,我发现可以使用 nullValuePropertyMappingStrategy =
为什么我不能在@Mapping属性中引用@Context参数?
使用mapstruct,我需要的是一个具有多个源的映射方法,并且这几个源被传递给其他映射方法,这样我就可以拥有所有映射的所有多个源
当我使用MapStruct的qualifiedByName和@Named时不生效
MapStruct版本是1.5.5.Final,JDK是17,这是我的代码 @映射器 公共接口UndoIssueConvert { UndoIssueConvert INSTANCE = Mappers.getMapper(UndoIssueConvert.class); @映射({ ...