JPA Dependency Injection mit Jersey in JEE Containern

Ziel des Posts ist es eine Webanwendung soweit aufzuwerten, dass sie mittels Dependency Injection auf Entitiymanager zugreifen kann, die durch den Container verwaltet werden.

@PersistenceContext(unitName = "test")
EntityManager em;

Die wichtigsten Punkte zusammengefasst

Auf Seiten von JPA wird die Datenbankverbindung durch die Java Transaction Api (JTA) übernommen. Dies wird in der persistence.xml Datei durch folgenden Eintrag erreicht:

<persistence-unit name="test" transaction-type="JTA">
<jta-data-source>jdbc/TestConnection</jta-data-source>
...
</persistence-unit>

die JTA Data Source wird anschließend im Container definiert. In Glassfish kann das im Adminpanel gemacht werden und ist 1 sehr ausführlich am Beispiel MySQL beschrieben.

Um nun eine erfolgreiche Dependency Injection für den EntityManager zu erreichen muss der EJB Container wissen, dass er dies überhaupt tun soll. Am Beispiel einer Jersey REST Page sieht man deutlich wie dies umgesetzt wird.

@Stateless
@Path("/user/{id: [0-9]+}")
public class UserOverview {

Im wesentlich war es das schon. Ohne die @Stateless-Annotation endet eine Anfrage an den EntityManager mit einer NullPointerException.

Ich habe mich bewusst kurz gehalten, um im wesentlich nur eine Unterstützung für meine eignene Aufzeichnungen zu liefern. Für weitergehende Fragen kann ich auf Wunsch gerne eingehen, sofern Bedarf vorhanden ist.

SVN in Eclipse mit Subclipse unter Ubuntu 10.04

Ich habe die Tage mit Ubuntu so meine Probleme gehabt. Nachdem man die Eclipse Version im Repo aufgrund der mangelnden Aktualität nicht wählen sollte habe ich versucht Subclipse mit JavaHL zum laufen zu bringen. Die Installation aus dem Subclipse Eclipse Repo erfolgt ohne Probleme, aber beim Zugriff auf die SVN Einstellungen wird man immer wieder mit dieser Meldung konfronitert:

Failed to load JavaHL Library.
These are the errors that were encountered:
no libsvnjavahl-1 in java.library.path
no svnjavahl-1 in java.library.path
no svnjavahl in java.library.path
java.library.path = /usr/lib/jvm/java-6-sun-1.6.0.03/jre/lib/i386/client::/
usr/lib/jvm/java-6-sun-1.6.0.03/jre/lib/i386::/usr/lib/firefox:/usr/lib/
firefox/:/usr/java/packages/lib/i386:/lib:/usr/lib

Das einfachste um diesen Fehler zu vermeiden ist der Wechsel von JavaHL auf SVNKit (Pure Java). Sollte man wie ich aber auf JavaHL angewiesen sein haben sich folgende Schritte als hilfreich erwiesen.

Installation und Konfiguration

Die Installation der nötigen Pakete erfolgt per apt-get unter Ubuntu (man kann auch aptitude verwenden – soltle man sogar). libsvn-java enthällt die nötige libsvnjavahl und legt sie unter /usr/lib/jni ab.

sudo  apt-get install libsvn-java

Hat man Eclipse aus dem Repo installiert so findet Eclipse beim Neustart die entsprechende Bibliothek und der Fehler gehört der Vergangenheit an. Hat man Eclipse selbst installiert, da man die neueste Version – Bleeding Edge sozusagen – nutzen will, dann muss man Eclipse noch mitteilen, wo es die Bibliothek findet. In die Datei ~/.eclipse/eclipserc trägt man folgende Zeile ein:

VMARGS="-Djava.library.path=/usr/lib/jni"

Nach einem Neustart sollte der Fehler ebenfalls der Vergangenheit angehören. Viel Spaß!