spring - Json-View 不适用于反应类型(Spring Web mvc,具有反应类型支持)
问题描述
在 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。
是否有任何提示或想法如何在 web mvc 上使用 jsonViews 机制来处理反应类型?(由于某些要求,无法将项目中的 web mvc 更改为响应式 web)提前致谢 :)
解决方案
发现作为解决方法,可以使用 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上创建问题?
推荐阅读
- spring - RouterFunction 无法注入处理程序 bean
- r - 在 R 中使用 rlist:merge.list 不起作用
- java - 什么是默认 JDBC 字符编码
- css - CSS:列数 + 变换 + 缩放 + 过渡 = 奇怪的行为
- wordpress - WordPress 众筹的不同捐赠账户
- angular - 如何在 Angular 构建库中声明一个 typings.ts 文件
- ios - UIAlertController 仅在特定时间
- android - Moshi 将值反序列化为 null
- javascript - TypeError: css.eachInside 不是 gulp.task 中的函数
- vue.js - 如何确保数据在基于 API 的 Vue 应用程序上始终是最新的?