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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:42:56