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

Spring Webflux抛出HttpMediaTypeNotAcceptableException异常原因求解

Spring Webflux控制器抛出HttpMediaTypeNotAcceptableException问题分析

核心原因

你使用的两种Webflux编程模型的API发生了冲突:

  • @RestController属于注解式编程模型,该注解自带@ResponseBody语义,Spring会自动将方法返回值交给HTTP消息转换器序列化为响应体
  • ServerResponse属于**函数式编程模型(RouterFunction路由模式)**专用的响应封装类,仅能在函数式路由的处理逻辑中返回,没有适配注解式控制器的消息转换规则

Spring找不到可将ServerResponse对象序列化为客户端可接受格式的转换器,因此抛出org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation异常。

解决方案

方案1:保留注解式控制器写法,调整返回值类型

直接返回Mono<String>即可,无需手动封装ServerResponse,Spring会自动处理响应配置:

@RestController
public class TestContoller {

    @GetMapping(value = "/Test", produces = MediaType.TEXT_PLAIN_VALUE)
    public Mono<String> handleRequest2() {
        return Mono.just("Hello")
                .onErrorResume(e -> Mono.just("Hello, Stranger"));
    }
}

方案2:保留ServerResponse写法,改用函数式路由模式

放弃@RestController注解,通过RouterFunction注册路由:

@Configuration
public class TestRouter {

    @Bean
    public RouterFunction<ServerResponse> testRoute() {
        return RouterFunctions.route(
                RequestPredicates.GET("/Test").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                request -> Mono.just("Hello")
                        .flatMap(s -> ServerResponse.ok()
                                .contentType(MediaType.TEXT_PLAIN)
                                .bodyValue(s))
                        .onErrorResume(e -> Mono.just("Hello, Stranger")
                                .flatMap(s -> ServerResponse.ok()
                                        .contentType(MediaType.TEXT_PLAIN)
                                        .bodyValue(s)))
        );
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:45:04