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

SpringBoot2+Webflux:WebTestClient返回异常且断言404失败

解决POST请求字节数组体返回404而非预期201的问题

我来帮你排查这个头疼的问题——你遇到的java.lang.AssertionError: Status expected:<201> but was:<404>,核心是请求的/api/foo路径在测试上下文里找不到对应的处理器,咱们一步步拆解可能的原因:

1. 先核对请求路径与控制器映射的精确匹配

首先确认你的@RestController里的POST方法映射路径是不是完全一致的/api/foo:

  • 有没有多写/少写斜杠?比如控制器里是@PostMapping("/foo")但你请求的是/api/foo
  • 有没有大小写问题?比如控制器是/api/Foo但你请求的是/api/foo
  • 举个反例,如果控制器是这样的,路径就完全对不上:
    @RestController
    @RequestMapping("/api")
    public class FooController {
        @PostMapping("/foos") // 这里是/foos,不是/foo
        public ResponseEntity<Void> createFoo(@RequestBody byte[] data) {
            // 业务逻辑
            return ResponseEntity.status(HttpStatus.CREATED).build();
        }
    }
    

2. 验证测试上下文是否正确加载了目标控制器

你的@SpringBootTest(classes = Applic...)指定的启动类,有没有覆盖到FooController所在的包?如果启动类的包和控制器的包不在同一层级或子层级,Spring测试上下文就扫描不到这个控制器,自然返回404。

  • 可以尝试去掉classes参数,让Spring自动扫描启动类所在的包及子包:
    @SpringBootTest // 去掉classes参数,默认扫描启动类所在包
    @AutoConfigureWebTestClient
    @RunWith(SpringRunner.class)
    @FixMethodOrder(NAME_ASCENDING)
    public class FooControllerTest {
        // 你的测试代码
    }
    
  • 或者确保指定的启动类上的@SpringBootApplication注解包含了控制器的包(比如用scanBasePackages参数)。

3. 检查请求体与控制器参数的兼容性

虽然404一般不是参数类型不匹配的问题,但也得确认控制器的参数是否正确接收字节数组:

  • 如果控制器期望的是MultipartFile(比如文件上传场景),而你直接发字节数组的话,应该用多部分请求来模拟:
    webTestClient.post()
        .uri("/api/foo")
        .contentType(MediaType.MULTIPART_FORM_DATA)
        .body(BodyInserters.fromMultipartData("file", new ByteArrayResource(yourByteArray)))
        .exchange()
        .expectStatus().isCreated();
    
  • 要是控制器就是接收@RequestBody byte[],那确保请求的Content-Type和控制器的consumes属性匹配(比如默认是application/octet-stream)。

4. 开启日志看请求匹配细节

如果上面的方法都没解决,可以开启Spring MVC的调试日志,直接看路由匹配过程:
在src/test/resources/application.properties里添加:

logging.level.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=DEBUG

运行测试后,日志会打印所有注册的路由,以及当前请求尝试匹配的过程,能一眼看出为什么找不到对应的处理器。

先从路径匹配和上下文加载这两个最常见的点入手,应该能快速定位问题。如果还是卡壳,可以把完整的控制器代码和测试代码贴出来,我再帮你深挖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:28:53