2017-05-26 69 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