Sonntag, 30. Januar 2011

@Resource annotation and lookup

The problem...
In the last hours I unfortunately had to fight a bit with the @Resource annotation in combination with the parameter "lookup". Many examples out there mention this new added parameter in JavaEE6. And i wanted to try. So an example webapp I downloaded worked fine. But as soon as I tried to use it in my project, i kept getting a "cannot find symbol" error message. I examined further and found out that the resource annotation can be found in the latest JDK 1.6, but also inside my maven dependency "javaee-api-6.0.jar". Unfortunately NetBeans always took the wrong version.

The solution...
is quite simple, if you use maven. I switched from Eclipse to Maven some weeks ago and used it´s wizzard to create my EJB modules. The netbeans modules unfortunately handle the pom.xml a bit different than the default archetypes. If you try to create a standard maven ejb module, the following xml is being created and even documented. This one will help you out:


<profiles>
<profile>
<id>endorsed</id>
<activation>
<property>
<name>sun.boot.class.path</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<!-- javaee6 contains upgrades of APIs contained within the JDK itself.
As such these need to be placed on the bootclasspath, rather than classpath of the
compiler.
If you don't make use of these new updated API, you can delete the profile.
On non-SUN jdk, you will need to create a similar profile for your jdk, with the similar property as sun.boot.class.path in Sun's JDK.-->
<compilerArguments>
<bootclasspath>${settings.localRepository}/javax/javaee-endorsed-api/6.0/javaee-endorsed-api-6.0.jar${path.separator}${sun.boot.class.path}</bootclasspath>
</compilerArguments>
</configuration>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>6.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
</profiles>

Switching to english... ;)

Well my english is kind of poor i guess. But to reach more people and help more people out there solving their problems with Java, IDE and that kind of stuff, I decided to write this blog in english from now on. Try not to judge me about my english knowledge ;) Have fun reading...

Sonntag, 23. Januar 2011

Integrational Unit Tests mit EJB3.1

Ich bin gerade damit beschäftigt, ein paar Integrationstest mit JUnit zu schreiben. Im speziellen handelt es sich bei den zu testenden Klassen hier um stateless session beans (SSB). Da meine derzeitige Anwendung unter GlassFish 3 läuft (JavaEE6, JSF2, EJB3.1, JPA2), entschied ich mich, die SSBs mit einem sogenannten embedded EJBContainer zu testen. Ein ganz simples Beispiel, wie das aussehen könnte, findet man in Adam Bien´s Blog:

http://www.adam-bien.com/roller/abien/entry/embedding_ejb_3_1_container

Dabei verwendete ich die neueste Maven-Dependency, die ich finden konnte. Da sie nicht als SNAPSHOT markiert war, bin ich davon ausgegangen, daß sie funktioniert (was sich leider in dem Fall als Fehler herausgestellt hat).


<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>


Nach einigem Testen (der Server fuhr nicht hoch, es traten Fehlermeldungen auf und es dauerte ewig, bis der Unittest fehlschlug) änderte ich die Versionsnummer und ging auf 3.0 zurück. Und siehe da, das Problem war gelöst, der Server läuft.

Vielleicht hilft diese Warnung ja dem einen oder anderen, etwas Zeit einzusparen bei der Fehlersuche.

Update: Hier gibts noch einen weiteren netten Artikel zum Thema EJB3 - Unittests:
http://www.bookware.de/kaffeeklatsch/archiv/KaffeeKlatsch-2010-07.pdf

Update 2: http://nosoftskills.com/2010/11/unit-testing-services-embedded-glassfish/

Und hier noch ein Verweis auf die Dokumentation des embedded Glassfish:
http://download.oracle.com/docs/cd/E19798-01/821-1754/gjldt/index.html

Montag, 17. Januar 2011

JSF2 - Using resource bundles

Anbei mal auf die Schnell ein netter Link zum Thema Resource Bundles in JSF2. Hier haben sich im Vergleich zu JSF1.2 ein paar Kleinigkeiten geändert bezüglich des Ablegens der Resource Bundles.

http://www.mkyong.com/jsf2/jsf-2-0-and-resource-bundles-example/

Viel Spaß beim Lesen

Sonntag, 16. Januar 2011

Inject oder EJB Annotation

Ist man beispielsweise in einer JSF2-Webapp unterwegs und möchte dort im Controller (den sogenannten Managed Beans / Backing Beans) auf die EJB3 - Ebene zugreifen (so man nicht Spring, sondern EJB3.1 verwendet), steht man vor der Qual der Wahl. Soll man nun das Local Interface der Stateless Session Bean per @Inject oder @EJB injecten lassen. Eine Empfehlung darauf gibt Gavin King (Entwickler von Hibernate und Seam) in folgendem Link:

http://seamframework.org/Community/InjectingWithEJBOrInject

Die Essenz ist, @EJB soweit möglich zu vermeiden und stattdessen auf die @Inject-Variante zurückzugreifen. Dies ist jedoch bei Remote-Zugriffen via Clients NICHT möglich. Will man also Session Beans nutzen, die per Remote-Interface (Annotation hierfür ist @Remote) genutzt werden sollen, benötigt man weiterhin @EJB.