Spring WebFlux 中, request.queryParams 只能获取到 查询参数, 对于 form 提交的参数无法进行参数自动装载

处理方式有两种:

一. 自定义 ArgumentResolver, 具体如下:

实现接口 org.springframework.web.reactive.config.WebFluxConfigurer

重载 configureArgumentResolvers, 自定义 ArgumentResolver

从 ServerWebExchange.formData中查找参数值返回

@Configuration

class WebConfig : WebFluxConfigurer {

@Autowired

private lateinit var applicationContext: ConfigurableApplicationContext

override fun configureArgumentResolvers(configurer: ArgumentResolverConfigurer) {

class RequestFormDataMethodArgumentResolver(

beanFactory: ConfigurableBeanFactory,

registry: ReactiveAdapterRegistry,

useDefaultResolution: Boolean

): RequestParamMethodArgumentResolver(beanFactory, registry, useDefaultResolution) {

override fun resolveNamedValue(name: String, parameter: MethodParameter, exchange: ServerWebExchange): Any? {

var result: Any? = null

val formData = exchange.formData.block()

val values = formData[name]

if( null != values ){

result = values.takeUnless { it.size == 1 } ?: values[0]

}

return result

}

}

configurer.addCustomResolver(RequestFormDataMethodArgumentResolver(applicationContext.beanFactory, ReactiveAdapterRegistry.getSharedInstance(), true))

}

}

该方法无法绑定 @RequestParam标记的参数

查看org.springframework.web.reactive.result.method.annotation.ControllerResolver

我们的自定义参数处理器是位于列表末尾的, 对于 @RequestParam标记的参数已经有前面的处理器处理过了

二. 将参数封装在对象中

例如:

@PostMapping

fun create(name: String, password: String) { ... }

可以改成为:

@PostMapping

fun create(user: User) {println("$user.name - $user.password") }

作为对象封装将会触发spring的databinder机制

WebFlux 中实现了org.springframework.web.bind.support.WebExchangeDataBinder

在检测到不是基本参数的时候, 需要进行参数绑定动作

/**

* Combine query params and form data for multipart form data from the body

* of the request into a {@code Map} of values to use for

* data binding purposes.

* @param exchange the current exchange

* @return a {@code Mono} with the values to bind

* @see org.springframework.http.server.reactive.ServerHttpRequest#getQueryParams()

* @see ServerWebExchange#getFormData()

* @see ServerWebExchange#getMultipartData()

*/

public static Mono> extractValuesToBind(ServerWebExchange exchange) {

MultiValueMapqueryParams = exchange.getRequest().getQueryParams();

Mono> formData = exchange.getFormData();

Mono> multipartData = exchange.getMultipartData();

return Mono.zip(Mono.just(queryParams), formData, multipartData)

.map(tuple -> {

Mapresult = new TreeMap<>();

tuple.getT1().forEach((key, values) -> addBindValue(result, key, values));

tuple.getT2().forEach((key, values) -> addBindValue(result, key, values));

tuple.getT3().forEach((key, values) -> addBindValue(result, key, values));

return result;

});

}

这里可以看见, 进行参数绑定是从 queryParams, formData, multipartData 三个地方读取, 所以, 对象中的参数是可以正常绑定的

注意问题

WebFlux 官方文档中提到, formdata数据来自于 application/x-www-form-urlencoded, 所以使用以上方式实现 form data 参数绑定的, 注意了, 提交方式一定为: application/x-www-form-urlencoded, 否则, 请使用 request body

flux读取不到数据_WebFlux 中form data获取不到参数问题相关推荐

  1. flux读取不到数据_【Java】spring-webflux两种开发模式,获取不到使用ajax的post提交的数据?...

    遇到的问题: 1.使用注解式:在js中使用ajax提交post数据name,在controller中使用@RequestBody无法获取到数据. 2.使用函数式:在js中使用ajax提交post数据n ...

  2. flux读取不到数据_spring-webflux两种开发模式,获取不到使用ajax的post提交的数据?...

    1.函数式: //1.若是form-data形式提交表单内容,即Content-Type: application/x-www-form-urlencoded;可以通过ServerWebExchang ...

  3. vue定时ajax获取数据,vue 中使用 AJAX获取数据的方法

    在VUE开发时,数据可以使用jquery和vue-resource来获取数据.在获取数据时,一定需要给一个数据初始值. 看下例: new Vue({ el:'#app', data:{data:&qu ...

  4. flux读取不到数据_Flux 傻瓜教程

    Flux 很不直观,没什么好的文档,而且一直在更新.作为一个脑子不好使的我,真的希望在我摸索学习 Flux 的时候,有人能告诉我下面这些东西. 应该使用 Flux 吗? 如果你的应用需要处理动态的数据 ...

  5. flux读取不到数据_初学flux的疑问?无法添加数据到DOM

    我初学flux,照着网上的代码,尝试学习写了一个简单的添加数据表页面,如图: 我想实现的功能是在下方表单填写数据之后点击提交可以实时的在上方表格添加一条数据,现在碰到的问题是我点击提交毫无反应也没有报 ...

  6. json pandas 内存溢出_python-将多个JSON记录读取到Pandas数据框中

    注意:str.join(自0.19.0开始)现在支持行分隔的json: In [31]: pd.read_json('{"a":1,"b":2}\n{" ...

  7. jmeter参数值只读取了第一个_jmeter中一个变量获取后对应多个值,然后在后面调用这个变量,同时遍历所有值的方法(for each的用法) 另附几种复杂控制器...

    例如,我有个变量member_id包含7个值,还有cc_file有5个值 我们有这样一个场景,7个学生访问这5个文件,且全部访问 1.提取7个学生id 访问http 提取id 其中match numb ...

  8. php获取伪静态参数,伪静态规则中RewriteCond如何获取多个参数?

    现有如下表单规则: /index.php?m=search&c=index&s=1&t=1&k=关键词 想通过伪静态的形式将路径转发为 /search?s=1& ...

  9. java nextint后有空格,Java中nextInt()后接nextLine()读取不到数据

    Java中nextInt()后接nextLine()读取不到数据 Java中nextInt()后接nextLine()读取不到数据 问题: 在使用Scanner对象的nextLine()函数读取输入的 ...

最新文章

  1. Ring Tone Manager on Windows Mobile
  2. 【会议邀请】第5届语言与智能高峰论坛将于本周五在线召开
  3. 现代制造工程课堂笔记03:第二部分(含易考点与必考点)
  4. matlab size x 2,Matlab中的N=size(X,2)是什么意思
  5. 安装ubuntu18.04虚拟机太慢
  6. m1芯片Mac安装pandas库(Rosetta2转译版)
  7. [翻译]两大因素推动向上比特币价格上涨
  8. python画圣诞树代码解读_实战 | 教你用Python画各种版本的圣诞树
  9. Java基础知识之循环语句(for循环、while循环)
  10. VisualStudio卸载后无法再次安装的解决方法
  11. 环回测试能够提供什么信息_以太网测试仪的主要功能有哪些?
  12. thymeleaf之菜单树
  13. 众人拾柴火焰高,5G承载将逐步进入成熟期
  14. This request has been blocked; the content must be served over HTTPS
  15. 十大流行健美营养补剂
  16. matlab 蜗杆轮廓,solidworks环面蜗杆画法
  17. HTML的style属性(替代font等标签)
  18. GitHub上最火的7个spring cloud开源项目,对新手太友好了
  19. 普通路由器和聚合路由器的区别
  20. Ubuntu 16.04 amd64下deb安装gcc5.4和所有依赖

热门文章

  1. 元素选择器(type selectors)
  2. 【软件安装】CUDA安装失败+win10+VS2015+CUDA8.0+CUDAVisualStudioIntegration找不到+Visual Studio Intergration安装失败
  3. Flink-DataStream执行环境和数据读取
  4. 小程序源码放自己服务器上,小程序源码怎么安装到自己服务器?
  5. canal的INVALID_TOPIC_EXCEPTION问题
  6. PPT制作小技巧-合并形状1
  7. SpringBoot中如何使用单元测试
  8. Gherkin语法详解之Data Format(七)
  9. 线性回归的推导与java代码
  10. Java poi 在 Excel中生成统计图