Ein einfaches Beispiel: Wir haben 2 Beans, Managed Beans, in einem verwalten wir den Login des Benutzers, im anderen behandeln wir seine Daten. Im LoginBean des Benutzers wird auch festgehalten ob er aktuell eingeloggt ist, und es soll dazu noch ein Status festgehalten werden. Dieser Status soll jedoch über das Bean dass seine Daten verwaltet gesetzt werden, da hier die notwendigen Berechnungen erfolgen.
LoginController:
import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; @ManagedBean(name = "loginController") @SessionScoped public class LoginController { // Bean Code... }
UserDataController:
@ManagedBean(name = "userDataController") @ViewScoped public class UserDataController implements Serializable { // Bean Code ... }
Will man auf normale Beans zugreifen, bzw. eine eigene Instanz für jede Injection haben, kann man dies einfach über folgende Annotation erreichen:
@Inject private UserDataBean userDataBean;
Will man jedoch ein ManagedBean erreichen können ist das nicht über die @Inject Annotation möglich. Wie bereits erwähnt würde eine komplett neue Instanz der Bean eingefügt werden und wir können somit nicht auf bereits erarbeitete Daten zugreifen oder für später zusätzliche Daten zur Verfügung stellen.
Hier muss man auf die Annotation @ManagedProperty zurückgreifen:
@ManagedProperty(value="#{loginController}") private LoginController loginController; @ManagedProperty("#{loginController.username}") private String username;
Mit ihr kann man entweder ein ganzes Bean oder auch nur ein einzelnes Attribut aus einer Bean injecten. Wichtig dabei ist, dass man Getter und Setter nicht vergisst, sowohl im injecteten Bean für das Property, also hier getUsername und setUsername, als auch im Bean das das Property gesetzt bekommt. Die Annotation wird aufgelöst und über entsprechende Getter und Setter werden die Daten ausgelesen UND auch gesetzt.
Vergisst man die ensprechenden Getter und Setter bekommt man eine Fehlermeldung wie diese:
com.sun.faces.mgbean.ManagedBeanCreationException: Verwalteter Bean userDataController kann nicht erstellt werden. Die folgenden Probleme wurden gefunden:
– Eigenschaft loginController für verwalteten Bean „userDataController ist nicht vorhanden.
Ein entsprechender UserDataController sieht dann in etwa so aus:
@ManagedBean(name = "userDataController") @ViewScoped public class UserDataController implements Serializable { @Inject private UserDataBean userDataBean; @ManagedProperty(value="#{loginController}") private LoginController loginController; @ManagedProperty("#{loginController.username}") private String username; // Bean Code ... public void setLoginController(LoginController bean){ this.loginController = bean; } public LoginController getLoinController(){ return this.loginController; } public void setUsername(String name){ this.username = name; } public String getUsername(){ return this.username; } }
Alles in allem sehr einfach, wenn man die kleinen Feinheiten mal weiß. Viel Erfolg mit der Dependency Injection!
Schreibe einen Kommentar