This blog has moved to
http://blog.matthias-reining.com

Die bestehenden Artikel bleiben vorerst alle bei blogspot. Neue Artikel veröffentliche ich allerdings nur noch auf http://blog.matthias-reining.com

Montag, 15. Dezember 2008

JBoss 5.0.0 GA und Eclipse

Endlich! JBoss 5 ist als GA Version erhältlich!

Wenn ich allerdings den JBoss Server in mein Eclipse WTP einbinden will bekomm ich folgende Fehlermeldung:

Missing classpath entry <server_path>\jboss-5.0.0.GA\server\default\lib\mail.jar

In der JBoss 5 CR2 Version hat dies noch alles funktioniert L

Der Grund hierfür liegt an der geänderten Verzeichnisstruktur des JBoss Servers. Es gibt nun ein common Verzeichnis, in dem gemeinsam genutzte libs (jar-Files) ausgelagert sind. Dafür ist nun bspw. das Verzeichnis jboss-5.0.0.GA\server\default\lib komplett leer.

Nach etwas googlen habe ich auch das Problem gefunden.

https://bugs.eclipse.org/bugs/show_bug.cgi?id=257823

Das Ticket in kürze zusammengefasst:

Durch die Änderungen in der JBoss Verzeichnisstruktur sind einige Anpassungen an der JBoss Einbindung notwendig:

In der Datei jboss5.serverdef im Eclipse plugin Verzeichnis (eclipse\plugins\org.eclipse.jst.server.generic.jboss_1.5.205.v200805140145\servers) müssen einige Änderungen vorgenommen werden.

Unter anderem muss zum Beispiel in der Zeile 129 folgendes

<exclude name="server/default/lib/mail.jar" /> mit <exclude name="common/lib/mail.jar" /> ausgewechselt werden.

Und so weiter…

Glücklicherweise gibt es das File auch schon komplett angepasst:

https://bugs.eclipse.org/bugs/attachment.cgi?id=120132

Achtung: immer nach dem neuesten Attachment Ausschau halten, vielleicht kommen ja noch ein paar Anpassungen…

Ansonsten wird dies sicherlich über einen Eclipse Patch reinkommen.

Bei mir hat dieser Workaround tadellos funktioniert. Vielen Dank an dieser Stelle an die fleißige Eclipse Community und vor allem an Wolfgang Knauf der das File hierfür erstellt hat!

Donnerstag, 4. Dezember 2008

Getter, Setter versus Domain Model/ Persistent Entities

Beim Anlegen meines Domain Models in Java stell ich mir mittlerweile schon die Frage: "Was sollen die ganzen getter- und setter Methoden?"

Selbstverständlich: die JavaBean Konvention!
http://java.sun.com/javase/technologies/desktop/javabeans/docs/spec.html

Anbei nun ein paar Gedanken hierzu:

Eigentlich sind die getter und setter Methoden bei Persistent Entities bzw. einem Domain Model zum Großteil nur eine Assistenten-Übungsaufgabe (zumindest innerhalb von Eclipse und allen anderen IDEs).

Es wäre zwar schon etwas schräg, aber eigentlich wäre hier mit public Variablen das Problem schon gelöst. Von einer Datenkapselung kann man eigentlich nicht mehr wirklich reden, da ja die getter und setter in der Regel direkten Zugriff auf die Variable geben. Gut: alle APIs die per Refelection die entsprechenden getter und setter Methoden aufrufen, müssten dann natürlich auch angepasst werden…

Soweit würde ich auch gar nicht gehen wollen.

Ich fände einen Ansatz per Annotations ganz nett:

@Entity
Public class Person {
    //…
    @GetterAccess
    private String firstname;
    //…
}

Die Annotation @GetterAccess würde hier nun ein entsprechendes public String getFirstname() automatisch generieren.

Eigentlich sollten alle Variablen, deren Klasse mit @Entity annotiert ist, automatisch getter und setter Methoden generiert bekommen. Die Methoden sollten dann einfach bei Bedarf "überschrieben" werden können.

Gibt es sowas vielleicht schon?

Soweit so gut erst mal mit meinen Gedanken zu Persitent Entities und deren unzählig vielen getter- und setter Methoden…

Montag, 1. Dezember 2008

ERROR [STDERR] javax.ejb.EJBException: java.lang.IllegalArgumentException: Wrong target.

Diese Fehlermeldung hat mich die letzten Stunden zur Verzweiflung gebracht, da ich auch im Web hierzu nichts Brauchbares finden konnte.

Szenario: Eclipse EJB3 Projekt(e) – 3 Projekte: <Project>, <Project>EJB, <Project>Web.

Die Exception fliegt, wenn von der Webapplikation ein SLSB aufgerufen wird und als Parameter eine Persitent Entity übergeben wird. Die Persistent Entity ist im EJB Projekt heimisch und wird der Webapplikation per Eintrag im Manifest.MF bekannt gemacht.
Wird null als Objekt übergeben funktioniert der "entfernte" Methodenaufruf (es handelt sich in meinem Fall aber nur um einen Local Call). Liegt also an dem Objekt selbst…

Natürlich wurde an den Eclipse Projekteinstellungen "wild" herumgedreht um alles mal zu probieren…

Hierbei wurde in den Projekt Properties unter "Java EE Module Dependencies" im Tab "Web Libraries" das entsprechende Projekt EJB Module ausgewählt. à Böses Faul!!! Die Abhängigkeit zwischen Web-Projekt und EJB-Projekt innerhalb einer EJB Anwendung darf nur über die Einstellungen "Java EE Module Dependencies -> J2EE Modules" vorgenommen werden. Hier kann dann das EJB Projekt ausgewählt werden.

Anschließend neu kompilieren bzw. einfach das AppServer (JBoss) Arbeitsverzeichnis "cleanen" und happiness ;-)