You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring启动报错:UnsatisfiedDependencyException问题修复方案

解决Spring启动时UnsatisfiedDependencyException错误

错误核心原因

从错误栈最底层可定位根本问题:

java.lang.ClassNotFoundException: 找不到com.api.lores.mapper.DentistMapper的实现类

MapStruct未生成DentistMapper对应的实现类,导致DentistServiceImpl初始化时抛出ExceptionInInitializerError,进而触发依赖注入链错误,最终导致dentistController Bean无法创建。

修复步骤

1. 检查MapStruct依赖配置

确保项目构建文件中正确引入MapStruct核心依赖和注解处理器,且版本一致(以Maven为例):

<dependencies>
    <!-- MapStruct核心依赖 -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.5.5.Final</version> <!-- 使用最新稳定版 -->
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <source>17</source> <!-- 匹配项目使用的Java版本 -->
                <target>17</target>
                <annotationProcessorPaths>
                    <!-- MapStruct注解处理器 -->
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.5.5.Final</version>
                    </path>
                    <!-- 若项目使用Lombok,需添加以下依赖确保兼容 -->
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.30</version>
                    </path>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok-mapstruct-binding</artifactId>
                        <version>0.2.0</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

2. 强制重新编译项目

执行以下Maven命令,清理旧编译产物并重新构建:

mvn clean compile

编译完成后,检查target/classes/com/api/lores/mapper/目录下是否生成了DentistMapperImpl.class文件。

3. 优化Mapper注入方式(可选,更符合Spring规范)

将Mapper改为Spring管理的Bean,避免静态初始化可能带来的类加载问题:

修改DentistMapper接口:

import org.mapstruct.Mapper;

@Mapper(componentModel = "spring") // 指定Spring作为组件模型
public interface DentistMapper {
    DentistModel toModel(DentistDto dto);
    DentistDto toDto(DentistModel model);
}

修改DentistServiceImpl,通过构造函数注入Mapper:

@Service
public class DentistServiceImpl implements DentistService {
    private final DentistRepository dentistRepository;
    private final DentistMapper dentistMapper;

    // 构造函数注入两个依赖
    public DentistServiceImpl(DentistRepository dentistRepository, DentistMapper dentistMapper) {
        this.dentistRepository = dentistRepository;
        this.dentistMapper = dentistMapper;
    }

    @Override
    public DentistDto findById(UUID id) throws NotFoundException {
        var dentist = dentistRepository.findById(id).orElseThrow(() -> new NotFoundException());
        return dentistMapper.toDto(dentist);
    }
    // ... 其他方法
}

4. 检查IDE注解处理器配置

如果使用IntelliJ IDEA,确保开启注解处理器:

  • 打开File > Settings > Build, Execution, Deployment > Compiler > Annotation Processors
  • 勾选Enable annotation processing

这样IDE在编译时会自动触发MapStruct的代码生成,避免手动编译的遗漏。


内容的提问来源于stack exchange,提问作者glpsx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:25:23