Reactive Spring在REST端点中不支持将HttpServletRequest作为参数吗?


问题内容

我创建了一个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()));
    }
}

不幸的是,当我尝试达到“ greetings”端点时,我得到了一个例外:

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

我在用

compile('org.springframework.boot.experimental:spring-boot-starter-web-

reactive’)

如何解决呢?

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

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

使用界面。现在得到:

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


问题答案:

你应该 永远不会 使用在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()));
    }
}

您可以ServerWebExchange直接注入ServerHttpRequest/ ServerHttpResponse