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 构造函数需要找不到的bean类型_Java_Spring_Spring Boot - Fatal编程技术网

Java 构造函数需要找不到的bean类型

Java 构造函数需要找不到的bean类型,java,spring,spring-boot,Java,Spring,Spring Boot,我目前正在学习一门关于Spring Boot的课程,并制作了一个Reddit克隆 在本课程中,我们有一个使用Mapstruc映射DTO的服务 我的问题是,当我尝试将映射器注入服务时,Spring找不到该类,并给出错误: Parameter 1 of constructor in com.subreddit.service.SubredditService required a bean of type 'com.subreddit.mapper.SubredditMapper' that cou

我目前正在学习一门关于Spring Boot的课程,并制作了一个Reddit克隆

在本课程中,我们有一个使用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.service;
导入静态java.util.stream.Collectors.toList;
导入java.util.List;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.stereotype.Service;
导入org.springframework.transaction.annotation.Transactional;
导入com.subreddit.dto.SubredditDto;
导入com.subreddit.exceptions.SpringRedditException;
导入com.subreddit.mapper.SubredditMapper;
导入com.subreddit.model.subreddit;
导入com.subreddit.repository.SubredditRepository;
导入lombok.allargsconstuctor;
导入lombok.extern.slf4j.slf4j;
@服务
@AllArgsConstructor
@Slf4j
公共类SubredditService{
私人最终分置分置分置分置分置分置;
私有SubredditMapper SubredditMapper;
@交易的
要保存的公共SubRedditt(SubRedditt到SubRedditt){
Subreddit save=subredditRepository.save(subredditMapper.mapdtosubreddit(subredditto));
subredditDto.setId(save.getId());
返回subredditDto;
}
@事务(只读=真)
公共列表getAll(){
返回subredditRepository.findAll()
.stream()
.map(subredditMapper::MapSubRedditTo)
.collect(toList());
}
公共SubReddit到getSubreddit(长id){
Subreddit Subreddit=subredditRepository.findById(id)
.orelsetrow(()->new springreddite异常(“未找到ID为-“+ID”的子reddit));
返回subredditMapper.mapsubredditodto(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);
}
package com.subreddit.mapper;
导入java.util.List;
导入org.mapstruct.InheritInverseConfiguration;
导入org.mapstruct.Mapper;
导入org.mapstruct.Mapping;
导入com.subreddit.dto.SubredditDto;
导入com.subreddit.model.Post;
导入com.subreddit.model.subreddit;
导入lombok.RequiredArgsConstructor;
@映射器(componentModel=“spring”)
公共接口子RedditMapper{
@映射(target=“numberOfPosts”,expression=“java(mapPosts(subreddit.getPosts())”)
Subreddit至MapSubRedditTo(Subreddit至Subreddit);
默认整数mapPosts(列出numberOfPosts){
返回numberOfPosts.size();
}
@继承反向配置
@映射(target=“posts”,ignore=true)
Subreddit映射到Subreddit(Subreddit到Subreddit);
}

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

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

您应该如何解决该问题

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

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

      从中获取他们的代码。 比较一下你做错了什么


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

      我也遵循了该教程,代码正常工作。不幸的是,缺少使SubredditMapper接口工作的一个步骤

      导致此错误的原因是Spring找不到bean映射器(Spring在构建过程中找不到映射器实现),而mapstruct处理器用于生成它

      在pom.xml中,将dependecy和annotationProcessorPaths路径部分添加到maven编译器插件的配置部分。添加后,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>
             ....
      
      
      org.mapstruct
      映射结构
      1.3.1.最终版本
      ...
      ....
      org.apache.maven.plugins
      maven编译器插件
      3.5.1
      1.8
      1.8
      org.mapstruct
      mapstruct处理器
      1.3.1.最终版本
      ....
      
      您需要做的就是在pom.xml文件上进行
      干净安装。
      这将生成实现类。
      清洁安装步骤

    • 右键单击pom.xml
    • 扩展运行方式
    • 选择Maven build
    • 为命令设置目标
      clean install
    • 应用>运行>关闭

    • 另外,我并没有看到构造函数di。从这里获取他们的代码:并运行它。问题在于组件扫描。谢谢你的帮助!