Spring Boot响应式方法加自定义注解后返回空白200状态问题
问题原因及解决方案
核心问题
你的切面方法validationProcessror返回类型是void,但在Reactive(WebFlux)场景下,@Around切面必须返回目标方法的响应流(即Mono/Publisher类型)。
当你调用method.proceed()时,虽然能拿到Mono对象并手动订阅打印数据,但因为切面没有把这个Mono返回给Spring WebFlux框架,框架无法订阅该流来生成HTTP响应,最终返回空白的200状态码。
修复步骤
修改切面方法的返回类型和返回逻辑:
@Around(value = "@annotation(ValidateParam)") public Object validationProcessror(ProceedingJoinPoint method, ValidateParam validateParam) throws Throwable { Object arg = method.getArgs()[0]; Class validatorclass = validateParam.name(); ValidationError err = applyValidation((Validator) validatorclass.getConstructor().newInstance(), arg); if (err.size() == 0) { // 必须返回proceed()的结果,让WebFlux处理这个Mono return method.proceed(); } else { // 用Mono.error包装异常,更符合Reactive编程规范 return Mono.error(new RuntimeException(err.errors.toString())); } }
补充说明
- 在WebFlux中,所有控制器的响应流(Mono/Flux)都需要被框架订阅才能生成响应,切面作为拦截器,必须传递这个流,而不是消费后丢弃。
- 用
Mono.error()包装异常,能让WebFlux正确转换为对应的错误HTTP状态码(默认500),比直接抛出异常更符合Reactive的错误处理模式。
内容的提问来源于stack exchange,提问作者Seema
相关产品推荐
相关产品推荐

