web-dev-qa-db-ja.com

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')

これを修正するには?

Link 完全なスタックトレースに。 リンク build.gradle

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

インターフェイスを使用します。取得中:

Java.lang.IllegalStateException:メソッドに[javax.servlet.http.HttpServletRequest]タイプの引数[0]のリゾルバがない(残りは同じ)

14
Dexter

never Spring Reactive WebアプリケーションでサーブレットAPIを使用する必要があります。これはサポートされておらず、これによりアプリがコンテナー依存になりますが、Spring Web Reactiveは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を注入できます。

23
Brian Clozel

私は呼び出し階層を深く調べたところ、このクラスInvocableHandlerMethodがパッケージorg.springframework.web.reactive.result.methodにあることがわかりました。

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

このクラスにはresolveArguments()メソッドがあり、「引数を解決する」ために呼び出されます。残念ながら、このリストにはjavax.servlet.http.HttpServletRequestのリゾルバはありません。

ただし、ServletServerHttpRequestを解決できるServerWebExchangeArgumentResolverがあるため、これからHttpServletRequestを抽出できます。うん….

したがって、エンドポイントは次のようになります。

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

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

ServletServerHttpRequestがパッケージからのものであることが重要ですorg.springframework.http.server.reactive

2
Dexter