Spring Boot 2.0.1.RELEASE:控制器加@Service后@WebMvcTest抛UnsatisfiedDependencyException
兄弟,你这问题我之前踩过坑!核心问题就是把@Service错加到控制器类上了,这直接打乱了Spring的分层依赖注入逻辑,咱们一步步来搞定:
问题根源分析
Spring的注解是严格分层的:@Controller/@RestController负责Web请求处理,@Service属于业务逻辑层,@Repository对应数据访问层。把@Service加到控制器上,会让Spring上下文初始化时混淆Bean的角色,进而抛出UnsatisfiedDependencyException。
具体解决方案
1. 恢复控制器的正确注解
立刻把控制器类上的@Service移除,只保留@Controller或@RestController(如果是REST接口就用后者):
@RestController @RequestMapping("/your-api-path") public class YourController { // 构造注入你的Service类 private final YourBusinessService yourService; public YourController(YourBusinessService yourService) { this.yourService = yourService; } // 你的接口方法... }
2. 确保Service类的注解规范
专门的业务逻辑类要单独标注@Service,并正确注入Repository:
@Service public class YourBusinessService { private final YourDataRepository yourRepository; // 构造注入Repository public YourBusinessService(YourDataRepository yourRepository) { this.yourRepository = yourRepository; } // 你的业务逻辑方法... }
3. 修正单元测试的上下文配置
根据测试类型调整注解:
- 控制器单元测试:用
@WebMvcTest只加载Web层上下文,并用@MockBean模拟Service依赖,避免加载完整的业务/数据层:
@RunWith(SpringRunner.class) @WebMvcTest(YourController.class) public class YourControllerTest { @Autowired private MockMvc mockMvc; @MockBean private YourBusinessService yourService; // 编写测试用例... }
- 集成测试:如果需要加载完整Spring上下文,用
@SpringBootTest:
@RunWith(SpringRunner.class) @SpringBootTest public class YourIntegrationTest { @Autowired private YourController yourController; // 集成测试逻辑... }
4. 排查剩余依赖问题
如果还是报错,一定要把完整的堆栈跟踪贴出来(你现在只给了开头),重点看UnsatisfiedDependencyException下面的嵌套异常——它会明确告诉你哪个Bean无法注入:是Repository没被Spring扫描到?还是构造函数参数不匹配?
另外检查:你的Repository接口是否继承了Spring Data的JpaRepository/CrudRepository(Spring会自动识别这类接口),或者是否标注了@Repository注解,同时确保它在Spring组件扫描的路径范围内。
内容的提问来源于stack exchange,提问作者Talgat
相关产品推荐
相关产品推荐

