Dependency Injection
Hakan
- java
0 mrjerk
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
Hallo,
Üblicherweise (ich kenne allerdings nur Spring DI) kannst Du bei DI auf zwei verschiedene Arten Objekte injezieren:
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