2017-05-26 88 views
0

我試圖在更改任何屬性後觀察@SessionScoped組件。 HttpSessionAttributeListener不會觸發cdi託管組件的更改。cdi觀察會話scoped bean已更改

@SuppressWarnings("serial") 
@SessionScoped 
public class TestSession implements Serializable { 


private User user; 

public TestSession() { 

} 

public User getUser() { 
    return user; 
} 

public void setUser(User user) { 
    this.user = user; 
} 

} 

一個例子的Servlet:

@SuppressWarnings("serial") 
@WebServlet(name = "demo", urlPatterns = "/demo") 
public class DemoServlet extends HttpServlet { 

private static final Logger logger = LoggerFactory.getLogger(DemoServlet.class); 

@Inject 
private TestSession testSession; 

@Override 
protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) 
     throws ServletException, IOException { 

    User user = new User(1L,new Role(1L)); 
    user.setId(RandomUtils.nextLong()); 
    testSession.setUser(user); //listen that component change something 


    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/demo.jsp"); 
    dispatcher.forward(httpServletRequest, httpServletResponse); 
} 

}

是A一路聽,當組件改變任何屬性?任何人都有辦法做到這一點?

重要說明:我沒有權限在TestSession java類或servlet上重寫或添加代碼。

+0

你的類與TestSession和Servlet在同一場戰爭中? – Rouliboy

回答

0

您可以在setUser()方法中放置interceptor,該方法創建event然後捕獲它。

+0

我不能與這個類進行交互,它的第三部分類 – jslsolucoes

+0

CDI,攔截器和事件是JavaEE容器的一部分。您是使用JavaEE容器還是僅僅將CDI用作依賴項?在第二種情況下,您需要使用java ee容器將它們包含在您的項目 – fortellao

+0

中。我的意思是我不能與TestSession類交互(重寫或添加註釋等) – jslsolucoes