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

2022-09-01 13:02:27

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

不幸的是,当我尝试点击“问候”端点时,我得到一个异常:

java.lang.IllegalStateException: No resolver for argument [0] type [org.apache.catalina.servlet4preview.http.HttpServletRequest]

我正在使用

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

如何解决这个问题?

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

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

使用界面。现在得到:

java.lang.IllegalStateException:方法上没有解析器 [javax.servlet.http.HttpServletRequest] 类型的参数 [0](rest is same)


答案 1

在 Spring Reactive Web 应用程序中使用 Servlet API。这是不支持的,这使得你的应用程序依赖于容器,而Spring Web Reactive可以与非Servlet运行时(如Netty)一起使用。

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

import org.springframework.http.server.reactive.ServletServerHttpRequest;

@RestController
public class GreetingController {

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

        return Mono.just(new Greeting("Hello..." + request.getURI().toString()));
    }
}

您可以注射或直接注射/ .ServerWebExchangeServerHttpRequestServerHttpResponse


答案 2

我深入研究了调用层次结构,发现在packing org.springframework.web.reactive.result.method中有一个类InvocableHandlerMethod,它具有:

private List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();

该类中有一个 resolveArguments() 方法,调用该方法是为了“解析参数”。不幸的是,此列表中没有javax.servlet.http.HttpServletRequest的解析器。

然而,有一个ServerWebExchangeArgumentResolver能够解析ServletServerHttpRequest,从中我可以提取HttpServletRequest。是的。。。。

所以端点看起来像:

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

    HttpServletRequest httpServletRequest = servletServerHttpRequest.getServletRequest();
    .
    .
    .
}

重要的是,ServletServerHttpRequest来自org.springframework.http.server.reactive软件包。


推荐