19

我有下一节课:

映射器

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);
}

当我运行上述方法时,我看到下一个异常:

错误 [dispatcherServlet]:? - servlet [dispatcherServlet] 在路径 [] 的上下文中的 Servlet.service() 引发异常 [处理程序处理失败;嵌套异常是 java.lang.ExceptionInInitializerError],其根本原因是 java.lang.ClassNotFoundException: dto.DeviceTokensMapperImpl

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

4

10 回答 10

31

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

<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>
于 2017-11-13T08:48:36.837 回答
20

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

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

于 2015-08-12T13:37:05.457 回答
13

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

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

于 2015-11-03T18:16:07.353 回答
6

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

正确的配置如下:

<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>
于 2016-07-04T06:49:25.170 回答
5

如果您将 Project lombok 与 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>
于 2019-01-05T11:46:55.123 回答
4

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

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 build clean&build。现在可以了!

于 2017-09-06T15:05:39.077 回答
2

在你的 build.gradle 添加

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

于 2018-12-07T10:16:33.030 回答
2

在您的 Mapper 类中,使用@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>
于 2020-07-02T04:10:39.687 回答
1

在我的情况下,我已经包裹<plugin><pluginManagement>标签中以解决日食(火星)错误,如下所示

<pluginManagement>
 <plugin> ... </plugin> 
</pluginManagement>

删除<pluginManagement>标签为我修复了它。

于 2016-09-08T02:17:49.723 回答
0

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

此外,我发现一些有用的东西是./gradlew clean build -x test有效的,但不能运行你的所有测试,这在我的情况下很多。

于 2016-11-21T15:15:53.807 回答