MapStruct需要Impl类

我有下一堂课:

映射器

public interface DeviceTokensMapper { DeviceTokensMapper INSTANCE = Mappers.getMapper(DeviceTokensMapper.class); @Mappings({ @Mapping(source = "tokenName", target = "tokenName"), @Mapping(source = "userOsType", target = "osType"), }) DeviceTokensDTO toDeviceTokensDTO(DeviceTokens deviceTokens); } 

实体:

 @Entity public class DeviceTokens { @Id @Column(name="token_name", nullable = false) private String tokenName; @Column(name = "os", nullable = false) @Enumerated private UserOSType userOsType; public DeviceTokens() {} public DeviceTokens(String tokenName, UserOSType userOSType) { this.tokenName = tokenName; this.userOsType = userOSType; } public String getTokenName() { return tokenName; } public void setTokenName(String tokenName) { this.tokenName = tokenName; } public UserOSType getUserOsType() { return userOsType; } public void setUserOsType(UserOSType userOsType) { this.userOsType = userOsType; } } 

DTO:

 public class DeviceTokensDTO { private String tokenName; private UserOSType osType; public DeviceTokensDTO() {} public DeviceTokensDTO(String tokenName, UserOSType osType) { this.tokenName = tokenName; this.osType = osType; } public UserOSType getOsType() { return osType; } public void setOsType(UserOSType osType) { this.osType = osType; } public String getTokenName() { return tokenName; } public void setTokenName(String tokenName) { this.tokenName = tokenName; } } 

和我使用这个映射的spring服务类的方法:

 @Transactional public DeviceTokensDTO storeToken(String tokenId, UserOSType userOsType) { DeviceTokens deviceTokens = new DeviceTokens(tokenId, userOsType); DeviceTokens newDevice = deviceTokensRepository.save(deviceTokens); return DeviceTokensMapper.INSTANCE.toDeviceTokensDTO(newDevice); } 

当我运行上面的方法时,我看到下一个exception:

错误[dispatcherServlet] 😕 – 用于servlet [dispatcherServlet]的Servlet.service()在上下文中,路径[]引发exception[处理程序处理失败; 具有根本原因的嵌套exception是java.lang.ExceptionInInitializerError] java.lang.ClassNotFoundException:dto.DeviceTokensMapperImpl

那么为什么mapper需要实现类呢? 可以请有人建议吗? 谢谢。

MapStruct在编译时生成代码,并调用Mappers.getMapper(DeviceTokensMapper.class); 将查找生成的mapper接口实现。 由于某种原因,您的部署单元中似乎缺少(WAR等)。

顺便说一句。 当使用Spring作为DI容器时,可以使用@Mapper(componentModel="spring")并且您将能够通过dependency injection而不是使用Mappers工厂来获取映射器实例。

您的项目中是否包含mapstruct-processor-xxmapstruct-xx库?

我有同样的问题,我意识到我忘了包含mapstruct-processor-xx。

如果使用maven,则需要添加mapstruct-processor依赖关系,如下所示:

  org.mapstruct mapstruct-jdk8 1.2.0.Final   org.mapstruct mapstruct-processor 1.2.0.Final  

你在用Maven吗? 如果是,那么很可能你错过了maven编译器插件下的mapstruct-processor配置。

正确的配置如下:

   org.mapstruct mapstruct  ${org.mapstruct.version}      org.apache.maven.plugins maven-compiler-plugin 3.5.1  1.6  1.6    org.mapstruct mapstruct-processor ${org.mapstruct.version}       

在我的例子中,我在标签中包装来解决日食(火星)bug,如下所示

   ...   

删除标签为我修复了它。

我在使用gradle的项目中遇到了同样的问题。 我替换了build.gradel

 compile 'org.mapstruct:mapstruct:1.2.0.CR2' 

 compile 'org.mapstruct:mapstruct-jdk8:1.1.0.Final' compile 'org.mapstruct:mapstruct-processor:1.1.0.Final' 

然后sh构建清洁和构建。 它现在有效!

我遇到了这个问题,因为在创建/编辑映射器类或相关类之后,我没有运行./gradlew clean build (用于Windows的gradlew.bat )。

另外,我发现有用的东西是./gradlew clean build -x test工作,但不会运行所有测试,这在我的情况下很多。