2017-11-02 12 views
0

タイトルのため申し訳ありません、より良いタイトルを得ることはできません。CDIインターセプタがサーブレットの現在のリクエストと同時ではありません

私は単純なサーブレットを作成し、CDIインターセプタを実装します。

これは

@Inject 
UserManagement user; 

protected void doGet(HttpServletRequest request, HttpServletResponse response) { 
    user.setUsername(request.getParameter("username")); 
    response.getWriter().println(user.getMessage()); 
} 

これはUserManagement豆である私のサーブレットです:

@SessionScoped 
public class UserManagement implements Serializable{ 

    private String username; 
    private String message = ""; 

    @UsernameSet 
    public void setUsername(String username){ 
     this.username = username; 
    } 
} 

これは、結合インターセプター(@UsernameSet)です:

@InterceptorBinding 
@Inherited 
@Target({ TYPE, METHOD }) 
@Retention(RUNTIME) 
@Documented 
public @interface UsernameSet { 
} 

これはインターセプタです:

@UsernameSet 
@Interceptor 
public class UserInterceptor implements Serializable { 

    @Inject 
    UserManagement user; 

    @AroundInvoke 
    public Object aroundInvoke(InvocationContext ic) throws Exception { 
     LOGGER.info("Entering method: " + ic.getMethod().getName()); 
     user.setMessage("Hello " + user.getUsername()); 
     return ic.proceed(); 
    } 
} 

インターセプタは機能しますが、サーブレットは直前のリクエストからUserManagement beanを返しますが、ロガーはすぐに表示されます。

まず要求: localhost?username=smitty

ブラウザ画面: Hello

2番目のリクエスト: localhost?username=werben

ブラウザ画面: Hello smitty

第三の要求: localhost?username=jensen

ブラウザ画面:あなたはインターセプターを作成するとき Hello werben

答えて

0

、それは前またはあなたのメソッドが呼び出された後のいずれかに呼び出されます。あなたが書いた方法で、メソッドが呼び出される前に呼び出されます。 InvocationContext.proceedはあなたのメソッド(と他の人が接続されている場合は他のインターセプタ)を効果的に呼び出します。

あなたが探している動作を取得するには、これに切り替えることができます。

@UsernameSet 
@Interceptor 
public class UserInterceptor implements Serializable { 

    @Inject 
    UserManagement user; 

    @AroundInvoke 
    public Object aroundInvoke(InvocationContext ic) throws Exception { 
     LOGGER.info("Entering method: " + ic.getMethod().getName()); 
     Object result = ic.proceed(); 
     user.setMessage("Hello " + user.getUsername()); 
     return result; 
    } 
}