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

时间:2016-11-01 13:43:17

标签: 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()));
    }
}

不幸的是,当我试着去问候&#34;问候&#34;端点我得到一个例外:

  

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

我正在使用

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

如何解决这个问题?

Link到完全堆栈跟踪。 Link来构建.gradle

---------- ---------- EDIT

使用界面。现在得到:

  

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

2 个答案:

答案 0 :(得分:14)

您应该永远在Spring Reactive Web应用程序中使用Servlet API。这不受支持,这使得您的应用程序依赖于容器,而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注入。

答案 1 :(得分:2)

我深入调用层次结构,发现有这个类 包 org.springframework.web.reactive.result.method 中的 InvocableHandlerMethod ,它有:

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

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

然而 ServerWebExchangeArgumentResolver 能够解析 ServletServerHttpRequest ,由此我可以提取 HttpServletRequest 。 Yeaaa ....

所以端点看起来像:

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

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

重要的是 ServletServerHttpRequest 来自包 org.springframework.http.server.reactive