1

既存のspring-mvcアプリケーションに非同期エンドポイントを追加しました。

@RestController
public class MyController {
    @PostMapping("/")
    public Mono<String> post(Object body) {
       return Mono.just("test");
       //webClient.retrieve().bodyToMono(String.class);
    }
}

リクエスト本文のペイロードをログに記録するグローバル インターセプター/フィルターを作成したいと考えています。しかし、どうすればアクセスできますか?

を追加しようとしましたHandlerInterceptorAdapterが、ペイロードは常に空です:

static class LoggingInterceptor extends HandlerInterceptorAdapter {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            ContentCachingRequestWrapper wrapper = new ContentCachingRequestWrapper(request);
            byte[] buf = wrapper.getContentAsByteArray();
            System.out.println(buf);
            System.out.println(buf.length);

            return true;
        }
}

ペイロードがまだリクエストに含まれていないか、すでに読み取られている可能性があります。では、この非同期のケースでどのように本体にアクセスできますか?

4

1 に答える 1

0

残念ながら、WebfluxではHandlerInterceptorAdapterを使用できません。これはWeb mvcモジュールに由来し、サーブレットでのみ動作するためです。解決策が記載された良い記事を見つけました。

PS リアクティブ エンドポイントを使用する場合は、spring-mvc の依存関係を削除する必要があります。

于 2020-04-01T09:59:28.893 に答える