Eu apliquei a Open session in view em um Filter.
A primeira coisa que é chamada é o filtro, depois é chamado um interceptor que faz controle de acesso, e esse interceptor redireciona para a página solicitada.
Eu verifico a sessão no meio do caminho e ela está aberta, mas mesmo assim está dando lazy Exception.
Alguém sabe o q pode ser?
Filtro:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
try {
HibernateUtil.currentSession();
HibernateUtil.beginTransaction();
chain.doFilter(servletRequest, servletResponse);
HibernateUtil.commitTransaction();
}
catch(JDBCConnectionException e) {
e.printStackTrace();
}
finally {
HibernateUtil.closeSession();
}
}
HibernateUtil:
public static Session currentSession() {
Session s = (Session) HibernateUtil.session.get();
if(s == null) {
s = HibernateUtil.sessionFactory.openSession();
HibernateUtil.session.set(s);
}
return s;
}
public static void closeSession() {
Session s = (Session) HibernateUtil.session.get();
if(s != null) {
s.close();
}
HibernateUtil.session.set(null);
}
public static void commitTransaction() {
Session s = (Session) HibernateUtil.session.get();
Transaction t = (Transaction) HibernateUtil.transaction.get();
if(s != null && s.isOpen() && t != null && !t.wasCommitted() && !t.wasRolledBack()) {
t.commit();
}
else {
throw new IllegalStateException("Erro ao comitar transação");
}
}
public static void rollbackTransaction() {
Session s = (Session) HibernateUtil.session.get();
Transaction t = (Transaction) HibernateUtil.transaction.get();
if(s != null && s.isOpen() && t != null && !t.wasCommitted() && !t.wasRolledBack()) {
t.rollback();
}
else {
throw new IllegalStateException("Erro no rollback da transação");
}
}
Local da lazy (minha custom tag):
JspWriter out = this.getJspContext().getOut();
UserVO user = (UserVO) this.getJspContext().getAttribute("user", PageContext.SESSION_SCOPE);
MenuItemVO parentMenu = (MenuItemVO) this.getJspContext().getAttribute("parentMenu",
PageContext.PAGE_SCOPE);
if(user != null && user.getUserType() != null) {
if(this.render.equalsIgnoreCase("mainMenu")) {
//Aqui parece q ele ja nao consegue recuperar os objetos
List<MenuItemVO> menuItems = user.getUserType().getMenuItems();
out.println("<table>");
out.println("<tr>");
//Aqui é onde ocorre o lazy exception
for(MenuItemVO menuItem : menuItems) {
if(menuItem.getParentMenuItem() == null) {
out.println("<td>");
if(menuItem.equals(parentMenu)) {
out.println("<b>" + menuItem.getNmMenuItem() + "</b>");
}
else {
out.println(menuItem.getNmMenuItem());
}
out.println("</td>");
}
}
out.println("</tr>");
out.println("</table>");
}