Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?
Reactive Spring does not support HttpServletRequest as parameter in REST endpoint?
我创建了一个如下所示的 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: No resolver for argument [0] of type
[org.apache.catalina.servlet4preview.http.HttpServletRequest]
我正在使用
compile('org.springframework.boot.experimental:spring-boot-starter-web-reactive')
如何解决这个问题?
Link to full stack-trace. Link 到 build.gradle
------------编辑----------
使用界面。现在得到:
java.lang.IllegalStateException: No resolver for argument [0] of type
[javax.servlet.http.HttpServletRequest] on method (rest is same)
深入调用层级,发现有这个class
InvocableHandlerMethod,在包 org.springframework.web.reactive.result.method 中
, 其中有 :
private List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
这个class中有一个resolveArguments()方法,调用到"resolve the arguments"。不幸的是,没有解析器
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
您应该永远不要在Spring响应式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()));
}
}
您可以注入 ServerWebExchange
或直接注入 ServerHttpRequest
/ ServerHttpResponse
。
我创建了一个如下所示的 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: No resolver for argument [0] of type [org.apache.catalina.servlet4preview.http.HttpServletRequest]
我正在使用
compile('org.springframework.boot.experimental:spring-boot-starter-web-reactive')
如何解决这个问题?
Link to full stack-trace. Link 到 build.gradle
------------编辑----------
使用界面。现在得到:
java.lang.IllegalStateException: No resolver for argument [0] of type [javax.servlet.http.HttpServletRequest] on method (rest is same)
深入调用层级,发现有这个class InvocableHandlerMethod,在包 org.springframework.web.reactive.result.method 中 , 其中有 :
private List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
这个class中有一个resolveArguments()方法,调用到"resolve the arguments"。不幸的是,没有解析器 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
您应该永远不要在Spring响应式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()));
}
}
您可以注入 ServerWebExchange
或直接注入 ServerHttpRequest
/ ServerHttpResponse
。