Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MapStruct需要Impl类_Java_Spring_Mapstruct - Fatal编程技术网

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 xxmapstruct 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之前,它是一个较旧的版本。您是如何解决的?它为我完成了任务。谢谢。