Java 构造函数需要找不到的bean类型
我目前正在学习一门关于Spring Boot的课程,并制作了一个Reddit克隆 在本课程中,我们有一个使用Mapstruc映射DTO的服务 我的问题是,当我尝试将映射器注入服务时,Spring找不到该类,并给出错误: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
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文件上进行干净安装。
。这将生成实现类。
清洁安装步骤
:
clean install
另外,我并没有看到构造函数di。从这里获取他们的代码:并运行它。问题在于组件扫描。谢谢你的帮助!