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();
}
}
}