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
相关产品推荐
相关产品推荐

