2017-07-07 3 views
0

の取り扱いとない前に、私は次のシナリオを実装する方法を探していますヘッダ(applicationId)を送信しますが、それをクエリパラメタ(別名RequestParameter)として送信する場合、この値はSpring Boot RestControllerのメソッドパラメータとして取られます。コピーRequestParamsインタフェースを壊すレガシーシステムを置き換えるにはRestController

は、現在の方法は次のようになります。

  1. 注釈にクエリパラメータまたはヘッダーをマップする方法何とか:私は2つの方法があるかもしれないと思う

    @RequestMapping(value = "/something", method = RequestMethod.GET) 
        public void doSomething(@RequestHeader("applicationId") String applicationId) { } 
    

    メソッドのパラメータ

  2. Interceptorを書くと、リクエストのすべてのクエリパラメータを読み込み、存在しないヘッダをその値で設定します。この方法では、メソッドにはまったく触れる必要はありません。

私はそれらを実装する方法がわかりません(1.でも可能です)。私は自分自身でHandlerInterceptorを試しましたが、それはpreHandleのquery-paramsを読み込みましたが、RestControllerに転送される前に要求にヘッダーを設定できませんでした。

+1

リクエストをラップする 'Filter'メソッドを記述し、' getHeader'メソッドをオーバーライドします。利用できない場合は、実際のリクエストに委譲します。おそらくこれをいくつかのよく知られたパラメータに制限したいと考えています。 –

+0

合理的に聞こえます。あなたは 'javax.servlet.Filter'を参照していますか?もしそうなら、どこで 'getHeader()'メソッドをオーバーライドしますか?私はいくつかのロジックを 'doFilter()'に追加しなければならないと思います。 – user3105453

+0

@ user3105453オプションとして、メソッドパラメータ( '@ RequestParam'や' @ RequestHeader'に似た)に独自のアノテーションを定義し、独自の 'HandlerMethodArgumentResolver' 'RequestHeaderMethodArgumentResolver'や' RequestParamMethodArgumentResolver'に似ています)。実装では、ヘッダーと要求パラメーターの値が検索されます。もちろんこの場合、すべてのメソッドでパラメータをマークする必要があります。あなたと一緒にOKであることは分かりません。 – Leffchik

答えて

1

HttpServletRequestWrapperを使用して着信要求をラップするFilterと記述してください。このラッパーはgetHeaderメソッドをオーバーライドする必要があります。

public ParameterToHeaderWrappingRequestFilter extends OncePerRequestFilter { 

    protected void doFilterInternal(
     HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
     throws ServletException, IOException { 
     filterChain.doFilter(new ParameterToHeaderWrappingRequest(request), response, filterChain); 
    } 
} 

あなたの春のブートアプリケーションで@Beanとしてこのフィルタを登録し、それが自動的に適用されます。

public class ParameterToHeaderWrappingRequest extends HttpServletRequestWrapper { 

    public String getHeader(String name) { 
     String header = super.getHeader(name); 
     if (header == null) { 
      header = getParameter(name); 
     } 
     return header; 
    } 
} 

トリックを行う必要があります。必要に応じて、いくつかの追加のヘッダーベースのメソッドをオーバーライドする必要があり、必要になる可能性があります。おそらく、パラメーターでオーバーライドするヘッダーの数を制限する必要があります。

残りのコードはそのままそのまま書くことができます。

+0

あなたのコードをありがとう。私は 'getHeader()'を 'getHeaders()'に変更して 'getHeaderNames()'をオーバーライドすることで動作させることができました。 'RestController'のように見えるのは、まずすべてのHeaderNamesを検索し、' getHeaders() 'を呼び出すことでそれらを繰り返します。 – user3105453

関連する問題