【问题标题】:Json-View not working for reactive types (Spring Web mvc, with reactive type support)Json-View 不适用于反应类型(Spring Web mvc,支持反应类型)
【发布时间】:2019-12-25 01:04:46
【问题描述】:

在 Spring Web mvc 应用程序中,JsonView 对响应式类型的支持存在问题。 Spring 5 通过 WebMvcConfig 中的 ReactiveTypeHandler + taskExecutor 配置支持响应式类型。数据正在返回,但 JsonView 被忽略,所有数据都将传递给订阅者。下面是代码示例:

@JsonView(Views.All.class)
@GetMapping(value = "/items", produces = MediaType.APPLICATION_STREAM_JSON_VALUE )
public Flux<Item> getItems() {
    return itemService.getItems();
}

对于非反应类型,JsonView 由 org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyAdviceChain#processBody 通过 JsonViewResponseBodyAdvice 处理。 但它不会在 ReactiveTypeHandler 中触发反应类型。

我知道在 spring web 响应式中,可以通过 ServerResponse 设置提示 Jackson2CodecSupport.JSON_VIEW_HINT 来支持 json 视图,但是这段代码:

@GetMapping(value = "/items", produces = MediaType.APPLICATION_STREAM_JSON_VALUE )
Mono<ServerResponse> getItems() {
    return ServerResponse
                .ok()
                .hint(Jackson2CodecSupport.JSON_VIEW_HINT, Views.All.class)
                .body(itemService.getItems(), Item.class);
}

在 mvc 中不起作用,它会抛出不受支持的异常 HttpMediaTypeNotAcceptableException,因为 org.springframework.http.converter.GenericHttpMessageConverter#canWrite 对于此目标类型为 false。

是否有任何提示或想法如何使用 jsonViews 机制来处理 web mvc 上的反应类型? (由于某些要求,无法在项目中将 web mvc 更改为响应式 web) 在此先感谢:)

【问题讨论】:

    标签: spring spring-mvc flux reactive json-view


    【解决方案1】:

    发现作为解决方法,可以使用 MappingJacksonValue 解决此问题。

    @GetMapping(value = "/items", produces = MediaType.APPLICATION_STREAM_JSON_VALUE )
    public Flux<MappingJacksonValue> getItems() {
        return itemService.getItems()
               .map(e -> {
                   MappingJacksonValue value = new MappingJacksonValue(e);
                   value.setSerializationView(Views.All.class);
                   return value;
                });
    }
    

    不确定spring的这种行为是否正确,是否可以将其视为错误并需要在webmvc上创建问题?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      相关资源
      最近更新 更多