Spring WebFluxTest无法解析实现接口的Controller请求
问题分析
将Spring WebFlux的Controller改为实现接口后测试返回404,核心原因是请求映射注解叠加导致路径错误,同时存在接口方法定义不规范的问题:
- 子类
PoiController额外添加了@RequestMapping("/locations"),与接口方法上的value="/locations"叠加,最终实际请求路径变为/locations/locations,而测试仍请求原路径/locations,触发404。 - 接口中定义的方法带有方法体,不符合REST接口的抽象定义规范。
- 子类方法重复添加
@PostMapping(),与接口上的请求方法注解冲突。
解决方案
1. 修正接口定义
让接口仅负责定义请求映射,方法设为抽象方法(无方法体):
@RequestMapping("\${api.base-path:}") interface PoiControllerApi { @RequestMapping( method = [RequestMethod.POST], value = ["/locations"], produces = ["application/json", "application/problem+json"], consumes = ["application/json"] ) suspend fun getLocations( @RequestBody poiRequestDto: PoiRequestDto, @PageableDefault(size = DEFAULT_PAGE_SIZE, sort = ["id"]) pageRequest: Pageable ): ResponseEntity<PageImpl<PoiDto>> }
2. 修正Controller子类
移除重复的路径和请求方法注解,仅保留@RestController,让接口的映射注解生效:
@RestController class PoiController : PoiControllerApi { override suspend fun getLocations( @RequestBody poiRequestDto: PoiRequestDto, @PageableDefault(size = DEFAULT_PAGE_SIZE, sort = ["id"]) pageRequest: Pageable ): ResponseEntity<PageImpl<PoiDto>> { // 业务逻辑实现 } }
3. 验证测试逻辑
测试代码无需修改,保持原有的@WebFluxTest(PoiController::class)即可。此时Spring会正确识别接口上的请求映射,测试请求/locations时能匹配到对应的方法。
额外注意事项
- 如果需要保留子类的
@RequestMapping,需调整接口的路径定义避免叠加:比如将接口方法的value改为空字符串,子类的@RequestMapping("/locations")作为基础路径。 - 确保
api.base-path配置未意外修改请求路径的前缀。
内容的提问来源于stack exchange,提问作者Victor Mikhailov
相关产品推荐
相关产品推荐

