当前位置: 首页 > 知识库问答 >
问题:

SpringBoot无法自动连接。没有为Mapstruct Mappers找到“UserMapper”类型的bean错误

贝杜吟
2023-03-14

这是我的用户类。

@Entity
@Table(name = "user_table")
@Data
public class User {

@Id
private Long id;
private String userName;
private String password;
 }

这是我的用户名,我知道字段名是一样的。但我正在努力理解这个概念。

@Data
public class UserDto {

private Long id;
private String userName;
private String password;
}

我想使用MapStruct进行到实体Dto和Dto实体转换。所以我编写了一个基本接口,比如EntityMapper。

public interface EntityMapper<D, E> {

E toEntity(D dto);

D toDto(E entity);

List<E> toEntity(List<D> dtoList);

List<D> toDto(List<E> entityList);

}

然后我创建了一个新的接口extends EntityMapper。

@Mapper(componentModel = "spring", uses = UserService.class)

public interface UserMapper extends EntityMapper<UserDto , User> {


@Mapping(source = "id", target = "id")
@Mapping(source = "userName", target = "userName")
@Mapping(source = "password", target = "password")
@Override
User toEntity(UserDto dto);

@Override
UserDto toDto(User entity);

@Override
List<User> toEntity(List<UserDto> dtoList);

@Override
List<UserDto> toDto(List<User> entityList);

这是我的控制器

@RestController
@RequestMapping("/v1/api/users")
public class UserController {

private final UserService userService;

public UserController(UserService userService) {
    this.userService = userService;
}

@PostMapping("/save")
public ResponseEntity<UserDto> saveUser(@RequestBody UserDto userDto){

    UserDto res = userService.saveUser(userDto);
    return ResponseEntity.ok(res);
}
}

最后,当我尝试创建一个新的服务类并使用UserMapper接口的引用时。Spring告诉我

无法自动连线。找不到“UserMapper”类型的bean。

这条线

   private final UserMapper userMapper;

这是我的整个服务课。当我删除@Service注释时,错误正在修复。但这是一个服务类,所以我必须把@service annotation放进去。

我尝试将@Component注释添加到UserMapper。但是应用程序无法启动。

@Service
public class UserService {

private final UserRepository userRepository;
private final UserMapper userMapper;

public UserService(UserRepository userRepository, UserMapper userMapper) {
    this.userRepository = userRepository;
    this.userMapper = userMapper;
}

public UserDto saveUser(UserDto userDto){

    User user = userMapper.toEntity(userDto);
    user = userRepository.save(user);
    UserDto res = userMapper.toDto(user);
    return res;
}

}

这是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 
      https://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.6.6</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>AprilSevenApp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>AprilSevenApp</name>
<description>AprilSevenApp</description>
<properties>
    <java.version>11</java.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-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.4.2.Final</version>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.dot</groupId>
        <artifactId>util</artifactId>
        <version>0.2.0</version>
    </dependency>
</dependencies>


<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

我刚刚为mapstruct添加了依赖项。如果我必须添加不同的依赖项,我不知道。

<!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct -- 
 >
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.4.2.Final</version>
</dependency>

共有1个答案

漆雕博
2023-03-14

必须向编译器插件添加注释处理器才能为UserMapper接口生成实现。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
    <annotationProcessorPaths>
        <path>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.4.2.Final</version>
        </path>
    </annotationProcessorPaths>
  </configuration>
</plugin>

此外,我认为不能删除uses=UserService。类,考虑到用户服务不是映射器。以下是使用注释参数的官方文档:

此映射程序使用的其他映射程序类型。可以是手工编写的类或MapStruct生成的其他映射程序。必须在生成的映射器类之间创建循环。

 类似资料:
  • 我将跟随《Spring行动》第五版学习Springboot。当我读到第6章时,我发现我的IDE想法似乎对bean org有一个bug。springframework。哈提奥斯。服务器实体链接。 在public DesignTacoController(TacoRepository tacoRepo,EntityLinks EntityLinks)构造函数中,IDEA给出了一个错误“无法自动连线。未

  • 我不确定我的代码出了什么问题。我正在学习弹簧靴。但我无法运行应用程序,因为我得到以下错误 模型类 主类:

  • 我在创建带有参数的@Bean时遇到问题,这运行得很好,但在intelliJ中,它给出的错误无法自动连线。找不到“String”类型的bean。 我要做什么?我正在尝试创建具有原型作用域的bean,在IntelliJ“无法自动连线。未找到‘String’类型的bean”中出现此错误有谁能帮我解决这个问题吗 这是原型测试的类

  • 试图在SpringBoot应用程序中创建bean,但出现以下错误“无法自动连线。找不到“InstructionRepository”类型的bean” InstructionRepository在jar中用@Repository注解,是一个扩展Spring数据接口的接口 ScheduleProcessor是一种方法 当我尝试通过传递基本包值来添加@ComponentScan注释时,错误消失了,但是,

  • 我想使用Jooq在postgres数据库中插入数据这是我的服务类 但是我有这个错误 无法自动连线。找不到“DSLContext”类型的bean。

  • 这是我的设想。我的项目正在使用Spring(3.2.3.Release)、Struts2(2.3.14.3)和JPA(2.0)。我们有一个包含各种实体和公共类的项目(我们称之为项目a)。我们使用项目A生成一个.jar文件,以便其他项目可以使用这些类。在项目A中,我们使用了Spring原型:@Component。@service或@repository用于我们希望Spring注入的那些类。每当我们尝