5

私は最新のSpring Data Restを使用しています。作成する前にイベントを処理しています。 "私が必要とするのは、モデルクライアントPOSTエンドポイントに送信されたHTTPヘッダーもキャプチャすることです。しかし、RepositoryEventHandlerのインターフェースはそれを公開しません。Spring Data Rest - @RepositoryEventHandlerでヘッダを受け取る方法

@Component 
@RepositoryEventHandler 
public class ClientEventHandler { 

    @Autowired 
    private ClientService clientService; 

    @HandleBeforeCreate 
    public void handleClientSave(Client client) { 
    ... 
    ... 
    } 
} 

どのようにイベントを処理し、HTTPヘッダーをキャプチャできますか?私は@RequestHeader HttpHeadersヘッダーを使用するSpring MVCのようなパラメータにアクセスしたいと思います。

+0

私がテストしたが、することができますしていません'@ Autowired' 'HttpServletRequest'は' @Autowiredのように直接入力します。 \tプライベートHttpServletRequestリクエスト; 'request.getHeader(" user-agent ")'を使用します。ここでの例はhttps://www.mkyong.com/java/how-to-get-http-request-header-in-java/ –

+0

HttpServletRequestはSpringマネージドBeanではないため、autowiredできません。 –

+0

カスタムコントローラーがなければ、ThreadLocalを使用して必要な値を現在のスレッドにバインドし、静的呼び出しで利用可能にするサーブレットフィルターが考えられます。たとえば、http://veerasundar.com/blog/2010/11/java-thread-local-how-to-use-and-code-sample/またはhttp://blog.smartbear.com/programming/how- and-when-use-javas-threadlocal-object/ –

答えて

6

は、あなたは、単に私が最もきれいだと思うコンストラクタ・インジェクションを、使用される所与のコードでは、あなたのEventHandler

@Component 
@RepositoryEventHandler 
public class ClientEventHandler { 
    private HttpServletRequest request; 

    public ClientEventHandler(HttpServletRequest request) { 
     this.request = request; 
    } 

    @HandleBeforeCreate 
    public void handleClientSave(Client client) { 
     System.out.println("handling events like a pro"); 
     Enumeration<String> names = request.getHeaderNames(); 
     while (names.hasMoreElements()) 
      System.out.println(names.nextElement()); 
    } 
} 

のフィールドに要求をautowireすることができますが、フィールドまたはセッター注入は全く同じように動作するはずです。

私は実際にstackoverflowの上の解決策が見つかりました:Spring: how do I inject an HttpServletRequest into a request-scoped bean?

ああ、私はちょうど@Marcがthecommentsでこれを提案した気づいた...しかし、私は実際にそれを試してみました:)

+0

'@ Autowired'を追加するのを忘れた –

+1

単一のコンストラクタがある場合は不要です –

+2

' ClientEventHandler'クラスは現在のリクエストを実際に参照する可能性があります。 @コンポーネント(したがってシングルトン)。まあ、スコープ付きのBean(例えば 'HttpServletRequest'のようなリクエストスコープ)がより長いスコープのBean(' @ Component'のような)に注入されると、実際にはBeanの代わりにAOPプロキシが注入されます。プロキシは、現在のスコープ内の実際のBeanインスタンスにコールをディスパッチします。 – jannis

関連する問題