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

