Java MapStruct需要Impl类
我还有下一节课: 映射器Java MapStruct需要Impl类,java,spring,mapstruct,Java,Spring,Mapstruct,我还有下一节课: 映射器 public interface DeviceTokensMapper { DeviceTokensMapper INSTANCE = Mappers.getMapper(DeviceTokensMapper.class); @Mappings({ @Mapping(source = "tokenName", target = "tokenName"), @Mapping(source = "userO
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;
}
}
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;
}
}
DTO:
@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;
}
}
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 service类中的方法:
@Transactional
public DeviceTokensDTO storeToken(String tokenId, UserOSType userOsType) {
DeviceTokens deviceTokens = new DeviceTokens(tokenId, userOsType);
DeviceTokens newDevice = deviceTokensRepository.save(deviceTokens);
return DeviceTokensMapper.INSTANCE.toDeviceTokensDTO(newDevice);
}
当我运行上述方法时,我看到下一个异常:
错误[dispatcherServlet]:?-Servlet的Servlet.service()
路径为[]的上下文中的[dispatcherServlet]引发异常[Handler]
处理失败;嵌套异常为
带有根本原因的java.lang.ExceptionInInitializerError]
java.lang.ClassNotFoundException:
dto.DeviceTokensMapperImpl
那么为什么mapper需要实现类呢?请有人给个建议好吗?
谢谢。MapStruct在编译时生成代码,并调用
Mappers.getMapper(DeviceTokensMapper.class)代码>将查找生成的映射器接口实现。由于某些原因,它似乎在您的部署单元(战争等)中缺失
顺便说一句,当使用Spring作为DI容器时,可以使用@Mapper(componentModel=“Spring”)
并且您将能够通过依赖项注入而不是使用映射器
工厂来获取映射器实例。您的项目中是否同时包含mapstruct processor xx和mapstruct xx库
我也遇到了同样的问题,我意识到我忘了包括mapstruct处理器xx。你在使用Maven吗?如果是,那么很可能您错过了maven编译器插件下的mapstruct处理器配置
正确的配置如下所示:
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.6</source> <!-- or higher, depending on your project -->
<target>1.6</target> <!-- or higher, depending on your project -->
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</dependency>
org.mapstruct
映射结构
${org.mapstruct.version}
org.apache.maven.plugins
maven编译器插件
3.5.1
1.6
1.6
org.mapstruct
mapstruct处理器
${org.mapstruct.version}
在我的例子中,我将
包装在
标签中,以解决eclipse(Mars)bug,如下所示
<pluginManagement>
<plugin> ... </plugin>
</pluginManagement>
...
删除
标记为我解决了这个问题。我遇到了这个问题,因为我在创建/编辑mapper类或相关类后没有运行/gradlew clean build
(gradlew.bat
for Windows)
另外,我发现一些有用的东西是/gradlew clean build-x test
可以工作,但不能运行所有的测试,这在我的例子中非常多。我在与gradle的项目中遇到了同样的问题。我将替换build.gradel
从
到
然后sh构建clean&build。现在可以了 如果使用maven,则需要添加mapstruct处理器依赖项,如下所示:
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.6</source> <!-- or higher, depending on your project -->
<target>1.6</target> <!-- or higher, depending on your project -->
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</dependency>
org.mapstruct
mapstruct-jdk8
1.2.0.1最终版本
org.mapstruct
mapstruct处理器
1.2.0.1最终版本
在您的构建中。添加
compile group: 'org.mapstruct',name: 'mapstruct-jdk8',version: 1.2.0.Final
annotationProcessor group: 'org.mapstruct',name: 'mapstruct-processor',version: 1.2.0.Final
在您的设置中启用注释处理
额外好处:为mapstruct添加插件intellij如果您正在使用ProjectLombok和mapstruct,那么您需要在maven编译器插件下配置这两个插件,因为它们都在编译时生成源代码
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<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>
org.apache.maven.plugins
maven编译器插件
${java.version}
${java.version}
org.projectlombok
龙目
${lombok.version}
org.mapstruct
mapstruct处理器
${org.mapstruct.version}
在映射器类中,使用@Mapper(componentModel=“spring”)
要使用mapstruct生成Impl类,您需要以下两个依赖项
<!-- Dependencies for Mapper -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
org.mapstruct
映射结构
${org.mapstruct.version}
org.mapstruct
mapstruct处理器
${org.mapstruct.version}
我已经添加了组件模型和put map struct processor,但是我仍然找不到ABCMapper的实现,它是Mappper接口。您找到解决方案了吗?目标/生成源
为空:[我升级了maven编译器插件
到3.6.0
,然后它启动了…在将maven编译器插件版本从2.5.1升级到3.6.1之前,它是一个较旧的版本。您是如何解决的?它为我完成了任务。谢谢。