2016-09-16 8 views
0

を使用してサービスBeanにHTTPリクエストヘッダを注入するか、私はどのスプリングサービスBeanにヘッダを注入するにはどうすればよい次のコードがどのようにコントローラにスプリング

@RestController 
public class MyController { 
@RequestMapping(value = "/mypath", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
public ResponseEntity moveEnrollment(@RequestHeader Map<String, String> headers) { 
    ..invoke business logic 
} 
} 

を使用して、すべての@RequestHeader Sにアクセスすることができではないコントローラですか?そうでなければ、私はこのハッシュマップをどこかで渡す必要があります。

私はHttpServletRequestを注入してからヘッダーを取得できることを知っていますが、直接注入できるのは簡単でしょう。

答えて

0

あなたが欠けているのは、HttpServletRequestがWebアプリケーションに送信されるリクエストのインスタンスであることです。あなたが他のクラスに注入できるグローバルBeanではありません。これは、すべての要求がある新しいインスタンスです。 ヘッダーも同じですが、リクエストのコンテキストでのみ有効です。どこにでもグローバルに注入することはできません。 あなたのコントローラーでは、それらはコントローラーメソッドに渡され、覚えている限り、コントローラー以外のインスタンスでは使用できません。

ExceptionHandlerやControllerのような他のタイプのハンドラがありますが、メソッド内で要求にアクセスできますが、任意のクラスではアクセスできません。それは要求の文脈の中になければならない。

+1

実際にHttpServletRequestをどこにでも注入できます。呼び出し元のスレッドがHTTP要求の一部である場合、実際にその要求インスタンス。しかし、スレッドが要求スレッドでない場合はnullです。 –

+0

あなたの言っていることを理解していますが、私は、安倍氏が求めていることは、方法ではなくサービスにそれを注入することだと思います。リクエストはグローバルBeanではなく、リクエストごとであることを説明していました。 –

+1

@AminJ httpservletrequestオブジェクトをSpringサービスBeanに挿入できます。私はそう思ってthreadlocalsを使用して行われます。したがって、リクエストごとにhttprequestオブジェクトが新しくても、Beanはそのスレッドに対して正しく注入されます。 qはリクエストヘッダーに対しても同じことができるかどうかでした。 – Abe

関連する問題