Montag, 23. Februar 2009

@EJB Dependency Injection für Struts 1.2/1.3 Action-Klassen

Auch wenn das Web-Framework Struts - gerade in den Versionen 1.x - schon etwas in die Jahre gekommen ist und mittlerweile zahlreiche Alternativen zur Verfügung stehen (JSF, Struts 2, Wicket, Stripes, GWT, Eclipse RAP...), wird es immer noch häufig eingesetzt, gerade wenn in diesem Bereich viel Entwickler-Know-How vorhanden ist.

Unschön ist dabei allerdings die unnötig komplizierte Einbindung in aktuelle Java EE-Umgebungen, da zum Abfragen von Enterprise-Ressourcen (z.B. Session Beans) explizite JNDI-ServiceLocator-Aufrufe nötig sind.

In JEE-Standard-Klassen ("managed classes") wie Servlets und JSF Managed Beans steht dagegen Dependecy Injection (DI) zur Verfügung, wodurch man sich Referenzen auf Enterprise-Ressourcen nicht mehr aktiv holen muss, sondern automatisch bereitgestellt bekommt.

Mit meiner kleinen Bibliothek Struts-DI funktioniert dies auch innerhalb von Struts-Actions:

public class MyAction extends org.apache.struts.action.Action {

@EJB
private MySessionBean msb;


@Override
public ActionForward execute(...) throws Exception {

String backendResponse = msb.myCall(...);
...
}
}

Die dazu notwendige Konfiguration ist denkbar einfach. Anstelle des Struts-RequestProcessors wird in der struts-config.xml ein neuer RequestProcessor eingetragen:

<controller nocache="true"
processorClass=
"com.muchsoft.struts.annotations.RequestProcessor"/>

Dies ist unter Struts 1.2 das übliche Vorgehen, um sich in die Action-Verarbeitung einzuklinken. Mit Struts 1.3 funktioniert dies ebenso (der dort vorhandene Chain-Mechanismus wird nicht verwendet).