Reactive Spring不支持HttpServletRequest作为REST端点中的参数?

Dex*_*ter 12 java spring spring-mvc spring-webflux

我创建了一个如下所示的RestController:

@RestController
public class GreetingController {

    @RequestMapping(value = "/greetings", method = RequestMethod.GET)
    public Mono<Greeting> greeting(HttpServletRequest request) {

        return Mono.just(new Greeting("Hello..." + request.toString()));
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我尝试点击"问候"端点时,我得到一个例外:

java.lang.IllegalStateException:没有类型为[org.apache.catalina.servlet4preview.http.HttpServletRequest]的参数[0]的解析器

我在用

compile('org.springframework.boot.experimental:spring-boot-starter-web-reactive')
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

链接到完整堆栈跟踪.链接到build.gradle

- - - - - 编辑 - - - - -

使用界面.现在得到:

java.lang.IllegalStateException:方法上没有[javax.servlet.http.HttpServletRequest]类型的参数[0]的解析器(其余相同)

Bri*_*zel 22

你应该永远不会使用在Servlet API在Spring反应的Web应用程序.这不受支持,这使得您的应用程序依赖于容器,而Spring Web Reactive可以与非Servlet运行时(如Netty)一起使用.

相反,你应该使用Spring提供的HTTP API; 这是您的代码示例,但有一些更改:

@RestController
public class GreetingController {

    @GetMapping("/greetings")
    public Mono<Greeting> greeting(ServerHttpRequest request) {

        return Mono.just(new Greeting("Hello..." + request.getURI().toString()));
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以注入ServerWebExchange或直接ServerHttpRequest/ ServerHttpResponse.

  • 您用于获取servlet响应的类是内部的,不应在应用程序代码中使用。这也可能会造成很大的问题,因为您应该只使用Servlet 3.1异步IO API来编写主体,否则将有可能完全阻塞应用程序。 (2认同)