Hakan: Dependency Injection

Hallo Leute,

ich habe wieder mal ein Problem und ich hoffe ihr könnt mir da wieder weiterhelfen....weil es gewohnt bin, dass man mir  hier helfen kann.
Ich kann euch aber versichern, ich habe vorher im Internet und in div. Büchern versucht viel darüber heraus zu finden!

Problem: Dependency Injection

Ich habe zwei Klassen, ein LoginHandler und ein UserBean

Der Loginhander erhält username und passwort über eine Eingabemaske und prüft in der DB, ob es diesen User gibt. Wenn ja, wird die Id des Users in dem Attribut this.id gespeichert.

@ManagedBean(name = "loginHandlerBean")
@SessionScoped
public class LoginHandler{
private int id;
private String username;
private String password;

//Geter- and Setter-Methods  
....  
  
public String checkLogin(){  
  
	// In der DB wird anhand von username  

// und password der User gesucht
// und die id zurück gegeben.
this.id = checkUserDB(username, password);

	if(this.id != null){  
		return "success";  
	}else{  
		return "fail";  
	}  
}  

}

In einer anderen JSP-Seite wird dann auf die UserBean zu gegriffen. Daher hab ich per DI (@Managed Property) die userid aus dem LoginHandler in die UserBean übertragen.

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

@ManagedProperty(value = "#{loginHandlerBean.id}")  
private int userid;  

private UserAttr userAttributes = new UserAttr();  

//Getter- and Setter-Methods  
....  

//Constructor  
public User(){  
	system.out.println("1. Userid is: "+this.userid);  
	  
	// Aus der DB die UserAttribute anhand von userid ermitteln  
	this.userAttributes = getUserAttributsfromDB(this.userid);  
}  
  
public void printUserid(){  
	system.out.println("1. Userid is: "+this.userid);  
}  

private UserAttr getUserAttributesfromDB(int pUserId){  
	....  
}  

}

Dies funktioniert auch, soweit ich auf der neuen JSP-Seite (Success-Seite) die Methode printUserid() aufrufe. Aber innerhalb des Konstruktors von UserBean steht mir die userid (aus DI) nicht zur Verfügung.

Innerhalb des Konstrukturos der Classe User erhaltte ich 0 und beim Aufruf der Methode printUserid() erhalte ich die richtige id.

Ich benötige aber innerhalb des Konstruktors die userid, damit ich damit in der DB weitere Daten ermitteln und in die Attribute speichern kann.

Mach ich hier grundlegend was falsch oder wie genau müsste ich eignetlich da vorgehen?

Vielen Dank schon mal im voraus!

Gruß, HAkan

  1. Hallo,
    Üblicherweise (ich kenne allerdings nur Spring DI) kannst Du bei DI auf zwei verschiedene Arten Objekte injezieren:

    • per Setter
    • Konstruktor

    In Deinem Fall wird "userid" über einen Setter injeziert...dieser wird natürlich erst NACH dem Konstruktor aufgerufen, folglich kannst Du IN dem Konstruktor nicht auf "userid" zugreifen (bzw. ist der Wert eben 0).

    Bei Spring kann man selbst festlegen, ob Variablen über den Konstruktor injeziert werden oder über Setter - weiß nicht wie das bei normalen Beans geht.

    In diesem Blog-Post wird Dein Problem beschrieben - dort wird in einem Kommentar vorgeschlagen, eine zusätzliche Init-Methode vorzusehen, die in Deinem Fall dann die DB-Abfrage machen würde, und diese mit einem @PostConstruct zu versehen - dann wird sie automatisch nach dem Konstruktor aufgerufen.

    Viel Erfolg,
    Jörg