Spring Boot MapStructMap程序返回空的Map对象

cuxqih21  于 2023-03-29  发布在  Spring
关注(0)|答案(6)|浏览(185)

我尝试使用MapStruct在dto和实体对象之间进行Map转换,但是生成的Map器实现只返回Map对象。

BeerMapperImpl

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2020-11-05T07:42:21+0800",
    comments = "version: 1.3.0.Final, compiler: javac, environment: Java 11 (Oracle Corporation)"
)
@Component
public class BeerMapperImpl implements BeerMapper {

    @Override
    public BeerDto beerToBeerDto(Beer beer) {
        if ( beer == null ) {
            return null;
        }

        BeerDto beerDto = new BeerDto();

        return beerDto;
    }
}

下面是我的代码。

聚合物.xml

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.3.0.Final</version>
</dependency>

.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <annotationProcessorPaths>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>1.3.0.Final</version>
            </path>
            <path>
                <groupId>
                    org.projectlombok
                </groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </path>
        </annotationProcessorPaths>
        <compilerArgs>
            <compilerArg>
                -Amapstruct.defaultComponentModel=spring
            </compilerArg>
        </compilerArgs>
    </configuration>
</plugin>

BeerMapper.java

@Mapper(uses = {DateMapper.class})
public interface BeerMapper {
    BeerDto beerToBeerDto(Beer beer);
    Beer beerDtoToBeer(Beer dto);
}

任何人都可以帮助建议什么可能会出错在我的代码?谢谢!

jhiyze9q

jhiyze9q1#

我已经找到了不需要降级spring Boot 的解决方案,问题是我使用lombok来生成getter和setter,另一方面mapstruct在你的对象中寻找getter和setter来填充它们,但是在这个例子中它找不到它们,仅仅是因为在编译过程中mapstructlombok之前运行。
解决方案很简单,在pom.xml文件中的mapstruct配置之前编写lombok的配置,以首先执行lombok。确保运行clean compile以删除旧文件。
maven-compiler-plugin工作配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.8.1</version>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
    <annotationProcessorPaths>
      <!--Project Lombok compile preprocessor-->
      <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
      </path>
      <!--Maps Struct compile preprocessor-->
      <path>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${mapstruct-ver}</version>
      </path>
    </annotationProcessorPaths>
  </configuration>
</plugin>
h9vpoimq

h9vpoimq2#

我删除了注解处理器路径标记,并将bot lombok和mapstruct声明为依赖项。
与类似问题的联系:MapStruct and Lombok not working together

o2rvlv0m

o2rvlv0m3#

我解决了这个问题后,降级 Spring Boot 启动器从2. 3. 5.释放到2. 1. 5.释放。

b91juud3

b91juud34#

我遇到了一个类似的问题,当原始对象被填充时,由mapstructMap创建的对象中的所有值都为空值。当我检查目标中生成的Map器时,生成的实现不包含实际的Map。我发现,当我对项目中的Map器做了一个小的更改并保存它时,这个问题很容易解决。目标中的Map器被重新设置为空值。我不知道为什么Map器生成不正确,但这是一个快速修复,为我工作。

xjreopfe

xjreopfe5#

我在dto中添加了一个@AllArgsConstructor,删除后-工作正常。愚蠢,但有效。依赖项和路径的顺序很好,Sping Boot 版本较旧,然后建议降级

eoigrqb6

eoigrqb66#

正如官方文档所建议的,lombok的新版本需要一个附加的注解处理器依赖项,因此您需要添加一个新的注解处理器,如so(maven)

<path>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok-mapstruct-binding</artifactId>
  <version>***</version>
</path>

确保你添加了与你的gradle版本兼容的最新版本
对于gradle用户,它将是这样的

annotationProcessor 'org.projectlombok:lombok-mapstruct-binding'

这样它在新版本的spring中就不会有问题了

相关问题