15. September 2008

Shale 1.0.5: prerender-Methode des ViewController wird gerufen, aber init-Methode nicht

Problem: bei einer BackingBean, die das ViewController-Interface des Shale-Frameworks verwendet wird zwar die prerender-Methode gerufen, jedoch die init-Methode nicht.

Ursache: Der org.apache.shale.view.faces.LifecycleListener ist nicht geladen. Dieser ist eigentlich im shale-view-1.0.5.jar (META-INF\taglib.tld) enthalten, wird aber wohl in manchen Konstellation (vermutlich wenn man selbst TLDs definiert hat) nicht angezogen.

Lösung: In der web.xml muss folgender Eintrag:
<listener>
<listener-class>
org.apache.shale.view.faces.LifecycleListener
</listener-class>
</listener>

9. September 2008

CodeCoverage Tool Emma mit Tomcat

Emma ist ein kostenloses Java-Tool um CodeCoverage, z.B. von Unit-Tests zu visualisieren.

Schritt 1
: Kompilierte Klassen mit Emma erweitern
<taskdef resource="emma_ant.properties" classpathref="pathtoemmaJars" />

  • instrpathref: Pfad zu den kompilierten klassen, die von Emma instrumentalisiert werden sollen
  • destdir: Verzeichnis, in das die von Emma instrumentalisierten Klassen geschribene werden
<target name="emmaInst" description="Instrument compiled classed with emma coverage collection infos">
<emma enabled="true">
<instr instrpathref="run.classpath" destdir="deploy/inst-classes" metadatafile="deploy/metadata.emma" merge="true" />
</emma>
</target>

Schritt 2: Tomcat starten.

emma.jar muss im Classpath sein

Folgende VMArgs für Emma müssen definiert werden für den Start:

-Demma.coverage.out.file=deploy\coverage.emma
-Demma.coverage.out.merge=true

Schritt 2.1: Test durchführen

Schritt 3: Tomcat stoppen, generiert Coverage-File

Schritt 4: Report generieren
 <target name="emmaReport" >

<emma enabled="true">
<report sourcepathref="sourcepath">
<fileset dir="deploy">
<include name="*.emma" />
</fileset>

<txt outfile="deploy/coverage.txt" />
<html outfile="deploy/coverage.html" />
</report>
</emma>

</target>

JPA Named Queries auslagern

Bei JPA können Named Queries neben der Definition in Klassen (über Annotations) auch in externe XML-Files definiert werden.

Das XML-File (z.B. META-INF/namedQueries.xml) hat folgendes Format:

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm/orm_1_0.xsd"
version="1.0">

<named-query name="findPersonByName">
<query>
<![CDATA[select person from Person person where person.name = :name]]>
</query>
</named-query>
...
</entity-mappings>


Die Datei wird dann in der persistence.xml eingebunden:


<persistence-unit name="MyPU" >
<provider>org.hibernate.ejb.HibernatePersistence</provider>

<mapping-file>
META-INF/namedQueries.xml
</mapping-file>
...
</persistence-unit>

2. September 2008

SOAP 1.2 WebServices mit JMeter testen

Problem: Bei der Verwendung von JMeter 2.3.1 (SOAP/XML-RPC Request) bekommt man eine SOAP-Exception als Antwort vom WebService: "Transport level information does not match with SOAP Message namespace URI"

Ursache: Der SOAP/XML-RPC Request kann nur Soap 1.1 Nachrichten erzeugen. Diese haben eine SOAPAction als Header-Element, die die aufzurufende Methode beinhaltet also z.B. myFunction. Das akzeptiert aber z.B. Axis2 nicht, dort muss die SOAPAction im HTTP-Header-Element "Content-Type" definiert sein.

Lösung: Einen Http Header Manager bei der JMeter Thread Group hinzufügen. Dort wird Parameter mit dem Name
Content-Type
definiert, der als Wert dann

application/soap+xml; charset=UTF-8; action="urn:myFunction"
hat.