Hakan: Lebensdauer einer ManagedBean

Hallo Leute,

WICHTIG!!!
Das ist kein Doppelpost, weil mein Problem sich hier nicht explizit auf die DI bezieht, sondern auf die Lebensdauer einer Bean! Ansonsten bitte ich jetzt schon um Entschuldigung!

Leider komme ich mit meinem Problem nicht weiter, obwohl ich dem eigenetlichen Problem immer näher komme. Ich habe eine Testanwendung zur Benutzerauthentifizierung.

Mein Problem bezieht sich auf die UserBean, in der ich per @ManagedProperty den gefundenen User aus der StartBean injeziere. Beim Logout wird meine UserBean jedoch nicht zerstört.
Die Konsequenz ist, loggt man sich erneugt ein, wird die UserBean nicht neu erstellt und auch die Injezierung wird nicht erneuert. Merken tut man das, wenn den UserBean debuggt und in die init-Methode (mit @PostConstruct annotiert) nicht hineinläuft.

Wieso wird mein UserBean beim Logout nicht zerstört, obwohl die Session geschlossen wird??????????

Hierfür habe ich eine LoginBean, die wie folgt aussieht:

@ManagedBean(name="startBean")
@SessionScoped
public class StartBean {

private String useremail;  
private String password;  
  
private UserDAO userDao = new UserDAO();  
  
// Getter- und Setter-Methoden  
....  
  
// Konstruktor  
public poStartBean(){  
}  
  
// Wird beim Login-Button ausgeführt  
public String checkUserlogin(){  
	  
	// User wird anhand mailaddi und pwd aus der DB ermittelt  
	userDao = startClass.validateUser(useremail, password);		  
	return "./in/success.xhtml?faces-redirect=true";  
}  
  
// Wird beim Logout-Button ausgeführt  
public String doLogout(){		  
	HibernateUtil.close();		  
	return "../login.xhtml?faces-redirect=true";  
}  

}

Zur besseren Fehlerfindung, die Methode, die den User aus der DB ermittelt
public class StartClass {
public UserDAO validateUser(String pUseremail, String pPassword){
UserDAOHome userDaoHome = new UserDAOHome();
UserDAO userDao = userDaoHome.findUser(pUseremail, pPassword);
return userDao;
}
}

public class UserDAOHome {

private static final Log log = LogFactory.getLog(UserDAO.class);  
  
@SuppressWarnings("unchecked")  
public UserDAO findUser(String searchUseremail, String searchedPassword){  
	log.debug("getting UserDAO instance with useremail: " + searchUseremail);  
	try {  
		  
		Query query = HibernateUtil.getSession().createSQLQuery("select id,useremail,password from t\_user where useremail = '" + searchUseremail + "'").addEntity(UserDAO.class);  
		List<UserDAO> list = query.list();  
		  
		// Ergebnisse anzeigen  
		Iterator<UserDAO> iterator = list.iterator();  
		while (iterator.hasNext()) {  
			UserDAO searchedUser = iterator.next();  
			if(searchedUser.getUseremail().equals(searchUseremail) && searchedUser.getPassword().equals(searchedPassword)){  
				log.debug("get successful, instance found");  
				return searchedUser;  
			}	  
		}  
		log.debug("get successful, no instance found");  
		return null;  
		  
	} catch (RuntimeException re) {  
		log.error("get failed", re);  
		throw re;  
	}  
}  

}

Nachdem der Login erfolgreich war, wird auf dei Seite success verzweigt, in der nur die Usermailaddi angezeigt wird und ein CommandLink für den Logout.
Für die Success-Seite habe ich eigene eigene Bean:

@ManagedBean(name = "userBean")
@SessionScoped
public class UserBean {

@ManagedProperty(value="#{startBean.userDao}")  
private UserDAO userDao = new UserDAO();  
  
private UserObject userObj = new UserObject();  
  
public PoUserBean(){		  
}  
  
@PostConstruct  
public void init(){  
	userObj.setId(userDao.getId());  
	userObj.setUseremail(userDao.getUseremail());  
}  

// Getter- und Setter-Methoden  
...  

}

Meine HibernateUtil-Klasse sieht wie foglt aus

public class HibernateUtil {

private static final SessionFactory sessionFactory;  
  
static{  
	try {  
		// SessionFactroy Erstellen aus hibernate.cfg.xml  
		sessionFactory = new Configuration().configure().buildSessionFactory();			  
	} catch (Throwable ex) {  
		// Exception loggen  
		System.err.println("Initial SessionFactory creation failed: "+ex);  
		throw new ExceptionInInitializerError(ex);  
	}  
}  
  
public static Session getSession(){  
	// Transaktion beginnen und Session erstellen		  
	Session session = sessionFactory.getCurrentSession();  
	  
	if(session != null){  
		if(!session.getTransaction().isActive()){  
			session.beginTransaction();  
		}  
	}  
			  
	return session;  
}  
  
public static void close(){  
	  
	Session session = sessionFactory.getCurrentSession();  
	  
	if(session.isOpen()){  
		if(session.getTransaction().isActive()){  
			session.getTransaction().commit();  
		}  
					  
		session.close();  
	}	  
}  

}

  1. Hi,

    weil du die Session beim logout nicht schliesst.

    Hth

    1. weil du die Session beim logout nicht schliesst.

      Nicht ganz. Die Session wird geschlossen. Jedoch benutze ich unter den hibernate Einstellungen folgendes:
      <property name="hibernate.current_session_context_class">thread</property>

      Das scheint auch die Wurzel des Übels zu sein.

      Das beduetet, soweit ich mich nicht täusche, dass meine Session an den Thread gehängt werden. Das wiederum bedeutet, dass das Schließen der Session nicht ausreichend ist.
      Ich muss den Browser schließen, dann werden auch die Beans zerstört.
      SO richtig verstehe ich das Verhalten ehrlich gesagt auch nicht und eine Lösung habe ich leider immer noch nicht. Aber die Session wird eindeutig geschlossen.

      1. Hi,

        nein, du schliesst eine Session, die nichts mit dem Problem zu tun hat. Sie ist nicht die Session, die du schliessen musst.

        Hth

        1. nein, du schliesst eine Session, die nichts mit dem Problem zu tun hat. Sie ist nicht die Session, die du schliessen musst.

          Und wie komme ich zu der Session, die ich schließen muss?

          1. Hi,

            z.B. http://stackoverflow.com/questions/5619827/how-to-invalidate-session-in-jsf-2-0

            Eine Hibernate Session hat nichts mit einer "Benutzer-Session" zu tun.
            (Du möchtest auch vielleicht nicht über eine komplette Session eine Hibernate Session offen halt, sie entspricht ungefähr einer Datenbankverbindung. Wenn du sie offen hälst, dann können sich bei max-connections von 100 gerade einmal 100 Benutzer auf deiner Seite einloggen).

            Hth

            1. Hallo asdf oder Hth....

              ich habs mir schon gedacht, dass es sich hierbei eigentlich um zwei völlig unterschiedliche Sachen handelt, aber ich habe auch auf keiner Seite oder Buch das vermittelt bekommen.

              Du hast mir jedenfalls sehr schnell und unkompliziert geholfen und daher dieses extra Dankeschön-Posting!!!

              Danke!!!!

              Gruß, Hakan