带有 Spring WebFlux 的 RestController :Required 参数不存在

Shu*_*lan 2 spring spring-mvc spring-boot spring-webflux

我用Spring WebFlux写了一个Rest Controller Demo,无法正常运行,源码如下:

@RestController
public class Demo{
    @PostMapping(value = "test2")
    public Integer getHashCode(@RequestParam("parameters") String parameters){
        return parameters.hashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

我用 Postman 测试了一下,返回:

{
    "timestamp": "2018-05-07T07:19:05.303+0000",
    "path": "/test2",
    "status": 400,
    "error": "Bad Request",
    "message": "Required String parameter 'parameters' is not present"
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

我用 Spring boot(v2.0.1.RELEASE) 编写了相同的控制器演示,它可以正确运行。为什么它不能在 Spring Webflux 中正确运行?

Bri*_*zel 5

参考文档中所述,基于 Servlet 的应用程序 (Spring MVC) 和 Spring WebFlux 在请求参数方面存在细微的行为差异。

在 Spring WebFlux 中,@RequestParam只会绑定查询参数。在您的情况下,您的 HTTP 请求未提供此类查询参数,并且您的方法签名未将其标记为可选。

查看您的 Postman 屏幕截图,您似乎打算将 HTTP 表单数据绑定到该参数,那么您可能应该查看命令对象