我尝试在Spring项目中添加mapstruct映射器。
我有一个用户实体。我需要在管理面板中显示用户列表。为此,我做了DTO UserForAdmin,映射器UserMapper和其余控制器AdminRestController。当我尝试获取UserMapper时遇到错误。
我尝试两种方法:
我收到错误
java.lang.ClassNotFoundException:找不到以下实现 ru.project.mapper.UserMapper
我遇到错误
启动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。
答案 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无法扫描此程序包。
希望能帮助您:)