【问题标题】:Constructor required a bean type that could not be found构造函数需要一个找不到的 bean 类型
【发布时间】:2020-10-17 22:36:24
【问题描述】:

我目前正在学习有关 Spring Boot 的课程并制作 Reddit 克隆。 https://www.youtube.com/watch?v=DKlTBBuc32c

在课程中,我们有一个使用 Mapstruc 映射 DTO 的服务。

我的问题是,当我尝试将映射器注入服务时,Spring 找不到该类并给出错误:

Parameter 1 of constructor in com.subreddit.service.SubredditService required a bean of type 'com.subreddit.mapper.SubredditMapper' that could not be found.

Consider defining a bean of type 'com.subreddit.mapper.SubredditMapper' in your configuration.

这里是服务:

package com.subreddit.service;

import static java.util.stream.Collectors.toList;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.subreddit.dto.SubredditDto;
import com.subreddit.exceptions.SpringRedditException;
import com.subreddit.mapper.SubredditMapper;
import com.subreddit.model.Subreddit;
import com.subreddit.repository.SubredditRepository;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Service
@AllArgsConstructor
@Slf4j

public class SubredditService {
private final SubredditRepository subredditRepository;
private SubredditMapper subredditMapper;

@Transactional
public SubredditDto save(SubredditDto subredditDto) {
    Subreddit save = subredditRepository.save(subredditMapper.mapDtoToSubreddit(subredditDto));
    subredditDto.setId(save.getId());
    return subredditDto;
}

@Transactional(readOnly = true)
public List<SubredditDto> getAll() {
    return subredditRepository.findAll()
            .stream()
            .map(subredditMapper::mapSubredditToDto)
            .collect(toList());
}

public SubredditDto getSubreddit(Long id) {
    Subreddit subreddit = subredditRepository.findById(id)
            .orElseThrow(() -> new SpringRedditException("No subreddit found with ID - " + id));
    return subredditMapper.mapSubredditToDto(subreddit);
}
}

这是映射器:

package com.subreddit.mapper;

import java.util.List;

import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

import com.subreddit.dto.SubredditDto;
import com.subreddit.model.Post;
import com.subreddit.model.Subreddit;

import lombok.RequiredArgsConstructor;


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

    @Mapping(target = "numberOfPosts", expression = "java(mapPosts(subreddit.getPosts()))")
    SubredditDto mapSubredditToDto(Subreddit subreddit);

    default Integer mapPosts(List<Post> numberOfPosts) {
        return numberOfPosts.size();
    }

    @InheritInverseConfiguration
    @Mapping(target = "posts", ignore = true)
    Subreddit mapDtoToSubreddit(SubredditDto subredditDto);
}

【问题讨论】:

标签: java spring spring-boot


【解决方案1】:

定义接口SubredditMapper 是不够的。要创建注入 bean,您需要一个实现它的类。

要让 MapStruct 生成这样的类,您需要在 IDE 和您的构建工具中激活注解处理器。对于每个使用@Mapper 注释的接口,注释处理器将生成一个实现该接口的类。在运行时,Spring 会创建这个类的一个实例,将它注册为一个 bean,然后将它注入到你需要的地方。

你应该怎么做才能解决这个问题?

  • 在您的 IDE(IDEA、Eclipse 等)中启用注释处理
  • 检查您的构建工具(Gradle、Maven)的配置是否正确,例如检查是否激活了 MapStruct 的注释处理,检查目录是否设置正确

【讨论】:

  • 另外,我没有看到构造函数 di。
【解决方案2】:

我看到了他们的代码。它正在工作。你没有很好地遵循这些步骤。

here 获取他们的代码。 比较你做错了什么。

可能的问题:问题出在包名上。 @ComponentScan 无法从该包中注册 bean,因为您在不知不觉中发送了错误的包名。

【讨论】:

  • 问题出在组件扫描上。感谢您的帮助!
【解决方案3】:

我也遵循了该教程,并且代码有效。不幸的是,缺少一个步骤来使 SubredditMapper 界面正常工作。

这个错误是因为Spring没有找到bean mapper(spring在构建过程中没有找到mapper实现)而使用mapstruct-processor生成的。

在您的 pom.xml 中,将dependecy 和annotationProcessorPaths 路径部分添加到maven-compiler-plugin 插件 的配置部分。添加后,您的 pom 文件应如下所示:

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

您所要做的就是在 pom.xml 文件中添加一个clean install 这将生成实现类。 Clean install steps:

  1. 右击pom.xml
  2. 展开运行方式
  3. 选择 Maven 构建
  4. 将目标设置为命令clean install
  5. 应用 > 运行 > 关闭

【讨论】:

    猜你喜欢
    • 2019-10-20
    • 2022-11-29
    • 2019-03-21
    • 2020-01-27
    • 1970-01-01
    • 2020-02-23
    • 2021-02-02
    • 1970-01-01
    • 2023-02-05
    相关资源
    最近更新 更多