[英]CDI Interceptor not simultaneous to current request in servlet
對不起,標題,我不知道要獲得更好的標題。
我創建了一個簡單的servlet並實現了CDI攔截器。
這是我的servlet
@Inject
UserManagement user;
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
user.setUsername(request.getParameter("username"));
response.getWriter().println(user.getMessage());
}
這是UserManagement bean:
@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();
}
}
攔截器確實可以工作,但是servlet從先前的請求中返回了UserManagement
bean,盡管記錄器立即顯示了該消息。
例
第一個請求: localhost?username=smitty
瀏覽器屏幕: Hello
第二個請求: localhost?username=werben
瀏覽器屏幕: Hello smitty
第三個請求: localhost?username=jensen
瀏覽器屏幕: Hello werben
創建攔截器時,它會在調用方法之前或之后被調用。 使用您編寫方法的方式,將在調用您的方法之前調用它。 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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.