编译时@Mapper注解未实现:Spring缺失BookMapper Bean依赖注入问题
解决MapStruct Mapper无法注入Spring容器的问题
遇到的异常:
org.springframework.beans.factory.UnsatisfiedDependencyException: 构造函数参数1无法找到com.zanah.hymnbook.mapper.BookMapper类型的合格Bean,无法满足依赖注入
下面是针对性的解决步骤:
1. 确保MapStruct注解处理器配置正确
仅添加MapStruct依赖不足以生成Mapper实现类,必须在pom.xml中配置注解处理器路径。如果还使用了Lombok,也要同步添加其处理器:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <!-- 适配你的JDK版本 --> <configuration> <source>1.8</source> <target>1.8</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${mapstruct.version}</version> <!-- 与依赖版本一致 --> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
2. 修复Service类的注入冲突
你的BookServiceImpl同时使用了@AllArgsConstructor和字段上的@Autowired,这会导致Spring注入逻辑冲突。只需保留@AllArgsConstructor,去掉字段上的@Autowired即可:
@Service @AllArgsConstructor public class BookServiceImpl implements BookService{ private final BookRepository bookRepository; private final BookMapper bookMapper; @Override public BookDto saveBook(BookDto bookDto) { Book recordFromDB = bookRepository.findByName(bookDto.getName()); if (recordFromDB != null) { throw new ResourceAlreadyExistException("Book", "ID", bookDto.getName()); } Book recordToBeSaved = bookMapper.bookDtoToBook(bookDto); Book savedRecord = bookRepository.save(recordToBeSaved); return bookMapper.bookToBookDto(savedRecord); } // 其他方法不变 }
3. 验证编译生成的Mapper实现类
执行编译后,检查target/classes/com/zanah/hymnbook/mapper目录下是否存在BookMapperImpl类。如果没有,说明注解处理器未生效,需重新检查pom配置或IDE的注解处理器启用状态(比如IDEA中要开启"Enable annotation processing")。
4. 清理并重新编译项目
执行mvn clean install命令,清理旧的编译文件并重新生成Mapper实现类,避免缓存导致的问题。
内容的提问来源于stack exchange,提问作者Emmanuel Kiprono
相关产品推荐
相关产品推荐

