Dependency Injection: ManagedBean in ManagedBean einfügen

ManagedBeans sind nicht per @Inject einzufügen. Damit nicht jedesmal eine neue Instanz erzeugt wird muss man auf eine andere Annotation zugegriffen werden.


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!

Ähnliche Artikel:

Autor: Thomas Pummer

Thomas Pummer ist Softwareentwickler an der Universität Wien. In seiner Freizeit betreut er das Open Source Projekt TrayRSS und werkt an diversen anderen kleinen Projekten. Er ist sehr interessiert an Open Source und Webentwicklung und testet gern neue Programmiersprachen.

3 Gedanken zu „Dependency Injection: ManagedBean in ManagedBean einfügen“

  1. Vielen Dank!
    Hat mir sehr geholfen. Sowohl das ManagedBean in der ManagedBean als auch die Exception.
    Wie soll man bei der Exception darauf kommen, dass Getter und Setter fehlen?

    Gruß
    Sven

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*