我无法在我的Spring项目中添加mapstruct

时间:2019-07-17 12:52:46

标签: spring autowired spring-restcontroller mapper mapstruct

我尝试在Spring项目中添加mapstruct映射器。

我有一个用户实体。我需要在管理面板中显示用户列表。为此,我做了DTO UserForAdmin,映射器UserMapper和其余控制器AdminRestController。当我尝试获取UserMapper时遇到错误。

我尝试两种方法:

  1. Mappers.getMapper(UserMapper.class)

我收到错误

  

java.lang.ClassNotFoundException:找不到以下实现   ru.project.mapper.UserMapper

  1. 自动接线

我遇到错误

  

启动ApplicationContext时出错。显示条件报告   在启用“调试”的情况下重新运行您的应用程序。 2019-07-17 15:47:07.886   错误13652 --- [restartedMain]   o.s.b.d.LoggingFailureAnalysisReporter:

     

********************************应用程序无法启动

     
     

说明:

     

ru.project.controller.rest.AdminRestController中的字段userMapper   需要类型为“ ru.project.mapper.UserMapper”的bean,该bean不能   被发现。

     

注入点具有以下注释:     -@ org.springframework.beans.factory.annotation.Autowired(required = true)

     

操作:

     

考虑在其中定义类型为“ ru.project.mapper.UserMapper”的bean   您的配置。

这是我的源代码。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>ru.project</groupId>
    <artifactId>project</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>project</name>
    <description>The project is project of resourse for investors.</description>

    <properties>
        <java.version>12</java.version>
        <org.mapstruct.version>1.3.0.Final</org.mapstruct.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity5</artifactId>
        </dependency>
        <dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>2.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <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>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>                 
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

我的界面UserMapper:

package ru.project.mapper;

import java.util.List;

import org.mapstruct.Mapper;
import ru.project.domain.User;
import ru.project.dto.UserForAdmin;

@Mapper
//@Mapper(componentModel = "spring")
public interface UserMapper {

    UserForAdmin UserToUserForAdmin(User user);

    List<UserForAdmin> UserListToUserForAdminList(List<User> user);


}

我的RestController:

package ru.project.controller.rest;

import java.util.List;

import org.mapstruct.factory.Mappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import ru.project.dto.UserForAdmin;
import ru.project.mapper.UserMapper;
import ru.project.service.UserService;

@RestController
public class AdminRestController {

    @Autowired
    private UserService userService;

    //@Autowired
    //private UserMapper userMapper;

    @GetMapping("/admin/users")
    public List<UserForAdmin> findAllUsers(){

        UserMapper userMapper = Mappers.getMapper(UserMapper.class);

        return userMapper.UserListToUserForAdminList(userService.findAll()); 
    }

}

我想使用Awtowired。

5 个答案:

答案 0 :(得分:0)

使用@Mapper(componentModel = "spring")-启用di。 运行mvn package命令-它创建实现类。 @Autowired映射器界面和使用。

(Java中的方法名称首字母应小写)

答案 1 :(得分:0)

您需要使用@Mapper(componentModel =“ spring”)

package ru.project.mapper;

    import java.util.List;

    import org.mapstruct.Mapper;
    import ru.project.domain.User;
    import ru.project.dto.UserForAdmin;

        @Mapper(componentModel = "spring")
        public interface UserMapper {

            UserForAdmin UserToUserForAdmin(User user);

            List<UserForAdmin> UserListToUserForAdminList(List<User> user);

        }

并在下面的AdminRestController中使用

@Autowired  
private UserMapper userMapper;

我假设 User UserForAdmin 具有相同的字段名称 运行mvn clean compile后,将生成源

答案 2 :(得分:0)

使用注释@Mapper(componentModel = "spring")的另一种方法是在插件中将组件模型添加为编译器参数。注释可以工作,但烦人的事情可能是必须将其添加到您创建的每个映射器中。您只需添加一次编译器参数即可,该参数可用于项目中的所有映射器。下面是一个带有componentModel编译器参数的插件定义示例。

<plugin>
               <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${org.projectlombok.version}</version>
                        </path>
                    </annotationProcessorPaths>
                    <compilerArgs>
                        <arg>-Amapstruct.defaultComponentModel=spring</arg>
                    </compilerArgs>
                </configuration>
            </plugin>

我已经在1.3.0.Final版本以及1.3.1.Final和Sping Boot 2.1.7 / 8/9中尝试过

答案 3 :(得分:0)

有一个简单的解决方案。

在您的映射器类中,使用@Mapper(componentModel = "spring")

,然后从终端运行mvn clean install命令。

或者对于STS / Eclipse,请转到Project> Run As> maven clean

然后运行Project> Run As> maven install

将会生成您的映射器Impl!

注意:关于插件

如果您同时使用以下两个依赖项,则无需在pom.xml文件中使用插件

        <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>

和属性将类似;

    <properties>
        <java.version>11</java.version>
        <org.mapstruct.version>1.3.1.Final</org.mapstruct.version>
    </properties>

答案 4 :(得分:-1)

找不到ru.project.mapper.UserMapper的实现,这意味着UserMapper必须是某个类的实现。

如公共类UserMapperImple实现UserMapper {XXXXXXX}

然后,Mapper.getMapper(“ UserMapper”)将获得UserMapperImple。

考虑在您的配置中定义类型为“ ru.project.mapper.UserMapper”的bean。这意味着@Mapper不起作用;我建议您检查spring-config.xml。可能是ApplicationContext无法扫描此程序包。

希望能帮助您:)