Sonntag, 12. Juli 2009

Dependency Injection in JSF

Neben dem klassischen Lookup gibt es in JavaEE5 die Verwendung von Annotations und der Dependency Injection (kurz DI). Diese DI wird auch in JSF unterstützt. So ist es in JBoss wie auch in Glassfish möglich, eine Session Bean per DI wie folgt injecten zu lassen:


//imports

class MyManagedBean {

@EJB private MySessionBeanLocalIF mySessionBean;

//some class using mySessionBean

}


Das erspart das Tippen des Lookups. Die einzigen Bedingungen sind dabei, daß die Variable weder static noch final sein darf. Nähere Informationen dazu gibt es auch in den JavaEE5 Specs:



Link zur Spezifikation, Abschnitt 5.2.3 Annotations and Injection

Weiterhin ist dabei zu beachten, daß managed Beans NICHT einfach per new-Operator instanziiert werden dürfen in diesem Fall. Hat man beispielsweise in einem Converter eine Methode, die über das managed Bean auf eine Session Bean zugreifen möchte, wird es zu einer NullpointerException kommen. Managed Beans holt man sich in diesem Fall also nicht per Instanziierung, sondern wie folgt:


ELContext elContext = FacesContext.getCurrentInstance().getELContext();
ELResolver elResolver = context.getApplication().getELResolver();
AccountManagementMB accountManagement = (AccountManagementMB) elResolver.getValue(elContext, null, "accountManagement");
return accountManagement.findCountryByName(value);


Dies führt dazu, daß die Dependency Injection berücksichtig wird und im managed Bean (hier beispielsweise AccountManagement) auf dessen Session Bean zugegriffen werden kann.

Keine Kommentare:

Kommentar veröffentlichen

Hier kann jeder (auch unregistrierte) Leser seine Meinung kundtun...