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-xx和mapstruct-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
工作,但不会运行所有测试,这在我的情况下很多。