首页 > 解决方案 > 当控制器的返回类型为接口的 Mono 时,返回值不会将返回值转换为 json,在 webflux 中

问题描述

在 Spring MVC 框架中,当控制器返回接口类型时,spring 的消息转换器可以将返回值转换为适当的消息(如 JSON)。

例如,当我调用“vehicle”api 时,我可能会收到一条 JSON 消息。

    @GetMapping("vehicle")
    public Vehicle getVehicle() {
        return new Car();
    }

    public interface Vehicle {

    }

    public class Car implements Vehicle {
        private String gearType;
    }

但是,Webflux 的行为不同。当返回类型是单声道接口时,它只支持“内容类型:文本/事件流”。

    @GetMapping("vehicle")
    public Mono<Vehicle> getVehicle() {
        return Mono.just(new Car());
    }

在我看来,Webflux 的行为让人不舒服。它是一个错误吗?我是否需要添加自定义 MessageWriter 来编码接口类型?

标签: javaspringspring-webflux

解决方案


在带注释的控制器中,返回 a Vehiclenot a就足够了Mono<Vehicle>,如Spring Docs中所述。

注意:您可以在使用时使用显式处理程序函数,Mono<T>或者Flux<T>因为处理程序函数在使用反应类型时更加显式。但是,它们使用起来更加冗长。


推荐阅读