<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Communardo Techblog &#187; J2EE</title>
	<atom:link href="http://www.communardo.de/techblog/category/j2ee/feed" rel="self" type="application/rss+xml" />
	<link>http://www.communardo.de/techblog</link>
	<description>Entwicklerblog der Communardo Software GmbH</description>
	<pubDate>Fri, 21 Nov 2008 19:28:18 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>JUG Saxony – Eclipse RCP/Swing AF/NetBeans RCP</title>
		<link>http://www.communardo.de/techblog/2008/10/12/jug-saxony-eclipse-rcpswing-afnetbeans-rcp/</link>
		<comments>http://www.communardo.de/techblog/2008/10/12/jug-saxony-eclipse-rcpswing-afnetbeans-rcp/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 17:41:57 +0000</pubDate>
		<dc:creator>Torsten Rentsch</dc:creator>
		
		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[jug]]></category>

		<category><![CDATA[rcp]]></category>

		<category><![CDATA[Softwareentwicklung]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=481</guid>
		<description><![CDATA[<p>Am 08.10.2008 traf sich die <a href="http://www.jugsaxony.de" target="_blank">JUG Saxony</a> zum dritten Mal in Dresden. Das Thema des Abends lautete Rich Client Platforms. Das ambitionierte Ziel war es im Rahmen dieser Veranstaltung die bekanntesten Frameworks vor- und gegen&#252;berzustellen. Rund 45 Interessenten hatten den Weg zur Informatik Fakult&#228;t der TU Dresden gefunden, darunter viele zum ersten Mal. Der Informationsbedarf auch abseits der Java Webentwicklung ist also vorhanden.</p>
<p><a href="http://www.communardo.de/techblog/wp-content/uploads/2008/10/jug-rcp.jpg"><img class="size-full wp-image-500 alignnone" src="http://www.communardo.de/techblog/wp-content/uploads/2008/10/jug-rcp.jpg" alt="" width="500" height="375" /></a></p>
<p>Den Anfang machte <a href="http://www.ralfebert.de" target="_blank">Ralf Ebert</a> (Freelancer) mit seinem Vortrag zur <a href="http://wiki.eclipse.org/index.php/Rich_Client_Platform" target="_blank">EclipseRCP</a>. Ihm folgte Stefan Saring (<a href="http://www.saxsys.de/" target="_blank">Saxonia Systems AG</a>) mit der Vorstellung des <a href="https://appframework.dev.java.net/" target="_blank">Swing Application Frameworks</a> (JSR 296). Beschlossen wurde der Abend durch <a href="http://blogs.sun.com/geertjan" target="_blank">Geertjan Wielenga</a> (<a href="http://www.netbeans.org" target="_blank">NetBeans/SUN</a>) mit <a href="http://platform.netbeans.org/" target="_blank">NetbeansRCP</a>. Nach drei Stunden voller Informationen und praktischer Vorf&#252;hrungen lautete das Fazit: Alle drei Frameworks haben ihre Daseinsberechtigung. Entwickler mit SWT Background greifen zu EclipseRCP, Swing Fans je nach ben&#246;tigtem Funktionsumfang und Projektgr&#246;&#223;e zum Swing Application Framework (kleinere bis mittlere Projekte) oder zu NetBeans RCP (mittlere und gr&#246;&#223;ere Projekte).</p>
<p>Wir hoffen am 27.11.2008 mit der vierten Veranstaltung  der <a href="http://www.jugsaxony.de" target="_blank">JUG Saxony</a> – diesmal zum Thema Rational Jazz/Team Concert - erneut allen Besuchern ein ansprechendes Programm zu bieten.</p>
<p>Auch f&#252;r das Jahr 2009 sind bereits f&#252;nf <a href="http://groups.google.de/group/jug-saxony/web/veranstaltungsplanung" target="_blank">Vortr&#228;ge in Vorbereitung</a>.</p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/techblog/2008/10/12/jug-saxony-eclipse-rcpswing-afnetbeans-rcp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Berlin.jar – R&#252;ckblick</title>
		<link>http://www.communardo.de/techblog/2008/09/27/berlinjar-rueckblick/</link>
		<comments>http://www.communardo.de/techblog/2008/09/27/berlinjar-rueckblick/#comments</comments>
		<pubDate>Sat, 27 Sep 2008 18:14:58 +0000</pubDate>
		<dc:creator>Torsten Rentsch</dc:creator>
		
		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[Softwareentwicklung]]></category>

		<category><![CDATA[AOP]]></category>

		<category><![CDATA[grails]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[jug]]></category>

		<category><![CDATA[konferenz]]></category>

		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=451</guid>
		<description><![CDATA[<p>Am 13./14.9.2008 fand erstmals die <a href="http://berlin.jar.jug-bb.de/" target="_blank">Berlin.jar </a>an der <a href="http://www.fhtw-berlin.de/" target="_blank">FHTW Berlin</a> statt. Die Java Konferenz wurde durch die <a href="http://www.jug-bb.de/" target="_blank">Java User Group Berlin Brandenburg</a> sehr gut organisiert. Verteilt &#252;ber beide Konferenztage gab es in f&#252;nf parallelen Tracks zahlreiche interessante Vortr&#228;ge, sowie HandsOn Sessions und Workshops f&#252;r die mehr als 250 Besucher. <span> </span>Einige Redner sind bereits von anderen Konferenzen bekannt. So gab Eberhard Wolff gleich zu Beginn Einblick in das L&#246;sungsangebot <span> </span>von SpringSource, der Firma hinter dem <a href="http://www.springframework.org/" target="_blank">Spring Framework</a>.<span> </span>Im Anschluss gab Torsten Fink einen &#220;berblick &#252;ber die JBoss/SOA-Plattform mit allerlei Verweisen auf den Einsatz in der Praxis. Nachdem am Grillstand f&#252;r das leibliche Wohl gesorgt wurde, brachte Alexander Greif anhand einer im Rahmen seines Vortrages erstellten Anwendung den Zuh&#246;rern die Funktionsweise der <a href="http://grails.org/" target="_blank">Grails Plattform</a> n&#228;her. Abgerundet wurde der Tag durch Oliver B&#246;hms Vortrag zu aspektorientierter <span> </span>Softwareentwicklung. Dabei wurde der Frage „<em>Gibt es ein Leben nach Java und OO?</em>“ nachgegangen. <span> </span>Mein Fazit: Aspektorientierte Programmierung ist eine sinnvolle Erg&#228;nzung (!) zur objektorientierten Entwicklung, aber sicher kein grunds&#228;tzlich neuer Ansatz. Den Weg in die Praxis hat sie schon seit l&#228;ngerer Zeit gefunden, wie z.B. das Spring Framework beweist. <span> </span></p>
<p class="MsoNormal">Leider waren damit der erste Konferenztag und unser Besuch der Berlin.jar schon vorbei.<span> </span>Am Tag zwei haben wir u.a. die Vortr&#228;ge der <a href="http://www.ubigrate.com/" target="_blank">ubigrate GmbH</a> (Drahtwanderung: WIIr machen den N&#228;XTen Schritt) und der <a href="http://www.buschmais.de/" target="_blank">buschmais GbR</a> (Integrationsmuster am Beispiel von Apache Camel, Paradigmenhochzeit: Felix und ServiceMix in trauter Zweisamkeit vereint, Modellierung statischer Dom&#228;nenmodelle mit Xtext) verpasst, aber vielleicht gibt es ja schon bald ein Wiedersehen bei der <a href="http://www.jugsaxony.de" target="_blank">JUG Saxony</a> <img src='http://www.communardo.de/techblog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p class="MsoNormal">Dieses wird es auf alle F&#228;lle im kommenden Jahr bei der zweiten Ausgabe der Berlin.jar geben.</p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/techblog/2008/09/27/berlinjar-rueckblick/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RMI-Kommunikation zu Remote-Hosts mit ung&#252;nstiger DNS-Konfiguration</title>
		<link>http://www.communardo.de/techblog/2008/09/17/rmi-kommunikation-zu-remote-hosts-mit-unguenstiger-dns-konfiguration/</link>
		<comments>http://www.communardo.de/techblog/2008/09/17/rmi-kommunikation-zu-remote-hosts-mit-unguenstiger-dns-konfiguration/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 11:46:59 +0000</pubDate>
		<dc:creator>Jan Dittberner</dc:creator>
		
		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[Softwareentwicklung]]></category>

		<category><![CDATA[ConnectionRefused]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[JMX]]></category>

		<category><![CDATA[RMI]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=401</guid>
		<description><![CDATA[RMI ist bei multi-homed Systemen mit schlecht konfiguriertem DNS etwas problematisch. Dieser Artikel beschreibt einen Workaround.]]></description>
		<wfw:commentRss>http://www.communardo.de/techblog/2008/09/17/rmi-kommunikation-zu-remote-hosts-mit-unguenstiger-dns-konfiguration/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hibernate: Spr&#252;nge beim Autoincrement</title>
		<link>http://www.communardo.de/techblog/2008/08/29/hibernate-spruenge-beim-autoincrement/</link>
		<comments>http://www.communardo.de/techblog/2008/08/29/hibernate-spruenge-beim-autoincrement/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 07:04:49 +0000</pubDate>
		<dc:creator>Alexander Buder</dc:creator>
		
		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[hibernate]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=382</guid>
		<description><![CDATA[<p>So ein SequenceGenerator ist schon eine feine Sache, vorallem bei der Verwendung von Relationalen Datenbanksystemen á la Oracle. Musste man sich ohne die Vorz&#252;ge des ORM (Object-Relational-Mapping) noch mit der h&#228;ndischen Erstellung von Sequenzen zur Incrementierung von Werten herumschlagen, erledigt Hibernate das Ganze voll automatisch mit zwei Zeilen Code.</p>
<h5>Die T&#252;cken der Technik</h5>
<p>In meinem letzten Projekt zeigte sich jedoch ein interessantes Ph&#228;nomen: Ich erstellte eine Klasse mit Annotation und einer Autoincrement-Sequence zum Hochz&#228;hlen der Id.</p>
<pre>@Entity
@SequenceGenerator(name = "user_seq", sequenceName = "user_id_seq")
public class User implements Serializable { ... }</pre>
<p>Zun&#228;chst schien alles zu funktionieren, als ich aber einige Zeit sp&#228;ter in die Datenbank schaute entdeckte ich seltsame Spr&#252;nge zwischen den Ids:</p>
<p> </p>
<table style="center;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="72" valign="top">
<p style="center;"><strong>id</strong></p>
</td>
<td width="72" valign="top">
<p style="center;"><strong>name</strong></p>
</td>
<td width="72" valign="top">
<p style="center;"><strong>age</strong></p>
</td>
</tr>
<tr>
<td width="72" valign="top">
<p style="center;">50</p>
</td>
<td width="72" valign="top">
<p style="center;">Fred</p>
</td>
<td width="72" valign="top">
<p style="center;">31</p>
</td>
</tr>
<tr>
<td width="72" valign="top">
<p style="center;">51</p>
</td>
<td width="72" valign="top">
<p style="center;">Harry</p>
</td>
<td width="72" valign="top">
<p style="center;">25</p>
</td>
</tr>
<tr>
<td width="72" valign="top">
<p style="center;">100</p>
</td>
<td width="72" valign="top">
<p style="center;">Mike</p>
</td>
<td width="72" valign="top">
<p style="center;">13</p>
</td>
</tr>
<tr>
<td width="72" valign="top">
<p style="center;">101</p>
</td>
<td width="72" valign="top">
<p style="center;">Frank</p>
</td>
<td width="72" valign="top">
<p style="center;">46</p>
</td>
</tr>
<tr>
<td width="72" valign="top">
<p style="center;">102</p>
</td>
<td width="72" valign="top">
<p style="center;">Richard</p>
</td>
<td width="72" valign="top">
<p style="center;">52</p>
</td>
</tr>
<tr>
<td width="72" valign="top">
<p style="center;">150</p>
</td>
<td width="72" valign="top">
<p style="center;">Ted</p>
</td>
<td width="72" valign="top">
<p style="center;">31</p>
</td>
</tr>
<tr>
<td width="72" valign="top">
<p style="center;">151</p>
</td>
<td width="72" valign="top">
<p style="center;">Kyle</p>
</td>
<td width="72" valign="top">
<p style="center;">29</p>
</td>
</tr>
<tr>
<td width="72" valign="top">
<p style="center;">152</p>
</td>
<td width="72" valign="top">
<p style="center;">Steve</p>
</td>
<td width="72" valign="top">
<p style="center;">34</p>
</td>
</tr>
<tr>
<td width="72" valign="top">
<p style="center;">153</p>
</td>
<td width="72" valign="top">
<p style="center;">Michael</p>
</td>
<td width="72" valign="top">
<p style="center;">42</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>Nach einigem Probieren stellte ich fest, dass die Spr&#252;nge stets nach dem Neustart der Anwendung auftraten. Das Problem konnte ich schlie&#223;lich nach etwas Recherche im Internet ausmachen. F&#252;r den <code>SequenceGenerator</code> existiert ein Parameter <code>allocationSize</code>, welcher die definierte Sequenz um den angegeben Wert erh&#246;ht und anschlie&#223;end diese Nummern vergibt. Erst wenn alle verbraucht sind, wird die Sequenz erneut aufgerufen. Der Nachteil dieser performanten Vorgehensweise ist, dass bei einem Neustart der Anwendung die zwischengspeicherten Werte verloren gehen und dadurch L&#252;cken zwischen den Id&#8217;s entstehen. Standardm&#228;&#223;ig ist diese Einstellung auf 50 gesetzt, was auch den Abstand in der Datenbank erkl&#228;rt. Die nachfolgende Einstellung schafft also Abhilfe:</p>
<pre>@Entity
@SequenceGenerator(name = "user_seq", sequenceName = "user_id_seq" allocationSize=1)
public class User implements Serializable { ... }</pre>
<p>Nun wird zur Generierung des n&#228;chsten Primary-Keys immer die Datenbanksequenz bem&#252;ht, was die Performance zwar etwas mindert, jedoch bleiben die L&#252;cken aus.</p>
<p> </p>
<p>Links: <a href="http://www.galileocomputing.de/artikel/gp/artikelID-328">http://www.galileocomputing.de/artikel/gp/artikelID-328</a><a href="http://www.galileocomputing.de/artikel/gp/artikelID-328?GalileoSession=54409864A3-Z76kjjVw#abschnitt0"></a></p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/techblog/2008/08/29/hibernate-spruenge-beim-autoincrement/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Logging per Interceptor mit Spring</title>
		<link>http://www.communardo.de/techblog/2008/07/21/logging-per-interceptor-mit-spring/</link>
		<comments>http://www.communardo.de/techblog/2008/07/21/logging-per-interceptor-mit-spring/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 15:17:05 +0000</pubDate>
		<dc:creator>Ralf Borchers</dc:creator>
		
		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[Softwareentwicklung]]></category>

		<category><![CDATA[andromda]]></category>

		<category><![CDATA[AOP]]></category>

		<category><![CDATA[Interceptor]]></category>

		<category><![CDATA[Logging]]></category>

		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=368</guid>
		<description><![CDATA[<p>Wenn man in Spring-Anwendungen zum Beispiel den Aufruf von Methoden loggen will, aber nicht in jeder gew&#252;nschten Methode eine Log-Anweisung einf&#252;gen m&#246;chte, kann man das Logging zentral als Aspekt definieren. Es k&#246;nnen damit die Methodenaufrufe aller Klassen geloggt werden, die als Bean durch Spring verwaltet werden.</p>
<p>Zu Beginn sollte die Bean f&#252;r den Interceptor (advice) definiert werden.</p>
<pre class="java">&lt;bean id="<span style="color: #ff6600;">methodLoggingInterceptor</span>" class="MethodLoggingInterceptor"/&gt;</pre>
<p>Danach kann eine advisor verwendet werden, der auf den Interceptor (advice) verweist und die joinpoints (die gew&#252;schten Methoden) &#252;ber einen regul&#228;ren Ausdruck engrenzt.</p>
<pre>&lt;bean id="<span style="color: #3366ff;"><strong>wsMethodLogger</strong></span>" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"&gt;
     &lt;property name="advice"&gt;
          &lt;ref local="<span style="color: #ff6600;">methodLoggingInterceptor</span>"/&gt;
     &lt;/property&gt;
     &lt;property name="patterns"&gt;
          &lt;list&gt;
              <strong> &lt;value&gt;de.communardo.*get.*&lt;/value&gt;
               &lt;value&gt;de.communardo.*process.*&lt;/value&gt;</strong>
          &lt;/list&gt;
     &lt;/property&gt;
&lt;/bean&gt;</pre>
<p>Dann muss den betreffenden Beans der neue Interceptor hinzugef&#252;gt werden. Hierbei ist auf die Reihenfolge zu achten.</p>
<pre class="java">&lt;bean id="profileWebservice"&gt;
    ...
    &lt;property name="interceptorNames"&gt;
         &lt;list&gt;
              &lt;value&gt;serviceTransactionInterceptor&lt;/value&gt;
              &lt;value&gt;hibernateInterceptor&lt;/value&gt;
              &lt;value&gt;<span style="color: #3366ff;">wsMethodLogger</span>&lt;/value&gt;
         &lt;/list&gt;
    &lt;/property&gt;
&lt;/bean&gt;</pre>
<p>Die Interceptor-Klasse kann zum Beispiel die Interfaces <code>MethodBeforeAdvice</code>, <code>AfterReturningAdvice </code>und <code>ThrowsAdvice </code>implementieren. In den entsprechenden Methoden kann dann je nach Aufrufzeitpunkt eine geeignete Meldung ins Log geschrieben werden.</p>
<pre class="java">import java.lang.reflect.Method;
import org.apache.log4j.Logger;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;

public class <span style="color: #ff6600;">MethodLoggingInterceptor </span>implements MethodBeforeAdvice, AfterReturningAdvice,
ThrowsAdvice {
    private Logger log = null;
    public MethodLoggingInterceptor() {
    }
    public void <span style="color: #339966;">before</span>(Method method, Object[] args, Object object) throws Throwable {
        log = Logger.getLogger(object.getClass());
        log.debug("Beginning method: " + method.getName());
    }
    public void <span style="color: #339966;">afterReturning</span>(Object returnValue, Method method, Object[] args, Object target)
    throws Throwable {
        log = Logger.getLogger(target.getClass());
        log.debug("Ending method: " + method.getName());
    }
    public void <span style="color: #339966;">afterThrowing</span>(Method method, Object[] args, Object target, Throwable ex) {
        log = Logger.getLogger(target.getClass());
        log.debug("Exception in method: " + method.getName() + " Exception is: " + ex.getMessage());
    }
}</pre>
<p>Hinweis f&#252;r AndroMDA-Nutzer<strong>: </strong>F&#252;r Klassen, die &#252;ber den Stereotyp <code>&lt;&lt;Service&gt;&gt;</code> verf&#252;gen, existiert der tagged value <code>@andromda.spring.service.interceptors.</code> Dar&#252;ber lassen sich den Services im Modell zus&#228;tzliche Interceptors hinzuf&#252;gen, die in die Liste der <code>interceptorNames </code>aufgenommen werden. Die Spring-Konfiguration der beteiligten Beans kann anhand des <code>applicationContext merge-point</code> in den Application Context integriert werden.</p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/techblog/2008/07/21/logging-per-interceptor-mit-spring/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JUG Saxony - EclipseLink</title>
		<link>http://www.communardo.de/techblog/2008/07/14/jug-saxony-eclipselink/</link>
		<comments>http://www.communardo.de/techblog/2008/07/14/jug-saxony-eclipselink/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 06:46:11 +0000</pubDate>
		<dc:creator>Torsten Rentsch</dc:creator>
		
		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[Softwareentwicklung]]></category>

		<category><![CDATA[database]]></category>

		<category><![CDATA[Eclipse]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[jaxb]]></category>

		<category><![CDATA[jug]]></category>

		<category><![CDATA[persistenz]]></category>

		<guid isPermaLink="false">http://com29/techblog/?p=362</guid>
		<description><![CDATA[<p align="left">Auch die zweite Veranstaltung der Java User Group Saxony kann als voller Erfolg bezeichnet werden. Shaun Smith, Project Lead des EclipseLink Projektes und  Produktmanager f&#252;r Oracle TopLink, gab am 09.07.2008 einen &#220;berblick &#252;ber die Features und die Funktionsweise von EclipseLink.</p>
<p>Die Firma <a href="http://www.ubigrate.com/" target="_blank">ubigrate</a> hat diese Veranstaltung an der Informatik Fakult&#228;t der TU-Dresden in Zusammenarbeit mit dem JUG Saxony Team f&#252;r die hiesige User Group organisiert und somit mehr als 50 Teilnehmern einen informativen und unterhaltsamen Abend erm&#246;glicht.</p>
<p><a href="http://www.communardo.de/techblog/wp-content/uploads/2008/07/2655055215_9bc9c99ed6.jpg"></a></p>
<p><a href="http://www.communardo.de/techblog/wp-content/uploads/2008/07/2655055215_9bc9c99ed6.jpg"><img src="http://www.communardo.de/techblog/wp-content/uploads/2008/07/2655055215_9bc9c99ed6.jpg" alt="" /></a></p>
<p><a href="http://onpersistence.blogspot.com/" target="_blank">Shaun Smith</a> ging w&#228;hrend seines Vortrages detailliert auf die <a href="http://java.sun.com/javaee/technologies/persistence.jsp" target="_blank">Java Persistence API</a> und die Referenzimplementierung <a href="http://www.eclipse.org/eclipselink/" target="_blank">EclipseLink</a> ein.  Dabei ist insbesondere die Vielseitigkeit des Frameworks hervorzuheben.  Neben Objekt-Relationalem Mapping (ORM) stellt es Funktionen zum Objekt-XML Mapping (in Version 1.0 noch nicht 100% <a href="http://jcp.org/en/jsr/detail?id=222" target="_blank">JAXB</a> 2.0 kompatibel) sowie Unterst&#252;tzung f&#252;r <a href="http://www.jcp.org/en/jsr/detail?id=235" target="_blank">Service Data Objects (SDO)</a> 2.1 zur Verf&#252;gung.  Sollte dies noch nicht gen&#252;gen kann EclipseLink leicht um weitere Mapping Ziele erweitert werden wie Shaun Smith anhand eines JSON Beispiels demonstriert hat.</p>
<p>Neben der Vorstellung von technischen Details und der ein oder anderen Anekdote aus dem Projektgesch&#228;ft (wer sich daf&#252;r interessiert sollte die kommenden JUG Veranstaltungen nicht verpassen <img src='http://www.communardo.de/techblog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ) wurden auch die  verschiedenen Mappings und das  Zusammenspiel mit den <a href="http://www.eclipse.org/dali/" target="_blank">Eclipse Dali JPA Tools</a> im Rahmen von Live Demonstrationen vorgef&#252;hrt.</p>
<p>Am Tag unserer Veranstaltung wurde EclipseLink  1.0 ver&#246;ffentlicht und somit f&#252;r den Produktiveinsatz freigegeben. Einen genaueren Blick ist es auf alle F&#228;lle wert.</p>
<p>Das n&#228;chste Treffen der JUG Saxony ist f&#252;r Oktober 2008 geplant.  Das Thema lautet Rich Client Platform (RCP) Entwicklung mit Java.</p>
<p>Informationen zur kommenden Veranstaltung gibt es demn&#228;chst auf der Webseite der JUG Saxony unter <a href="http://www.jugsaxony.de" target="_blank">http://www.jugsaxony.de</a>. Die Folien zum EclipseLink Vortrag sind ebenfalls auf dieser Seite zu finden.</p>
<p>Einen Bericht zum Treffen in englischer Sprache gibt es im <a href="http://blog.ubigrate.com/2008/07/11/jug200802/" target="_blank">ubigrate Blog</a>.</p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/techblog/2008/07/14/jug-saxony-eclipselink/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java Projekte mit Groovy - Der erste Kontakt&#8230;</title>
		<link>http://www.communardo.de/techblog/2008/06/02/java-projekte-mit-groovy-der-erste-kontakt/</link>
		<comments>http://www.communardo.de/techblog/2008/06/02/java-projekte-mit-groovy-der-erste-kontakt/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 11:25:53 +0000</pubDate>
		<dc:creator>Alexander Buder</dc:creator>
		
		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[groovy]]></category>

		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/2008/06/02/java-projekte-mit-groovy-der-erste-kontakt/</guid>
		<description><![CDATA[<p>Wer sich als Java-Entwickler bereits ein wenig mit der Sprache Groovy besch&#228;ftigt hat, wird w&#228;hrend der Projektarbeit sicher schon einige Verwendungsm&#246;glichkeiten f&#252;r Groovy-Sprachkonstrukte gefunden haben. In den meisten F&#228;llen betrifft dies eher relativ triviale Funktionen, wie Operationen im Dateisystem oder das Auswerten von Variablen eines Typs. Da aber gerade in der Erstellung von Prototypen die Evaluierung von Kernprozessen im Vordergrund steht, kann die erg&#228;nzende Verwendung von Skriptsprachen á la Groovy etwas mehr Geschwindigkeit und Flexibilit&#228;t in die Entwicklung bringen.</p>
<h5><font color="#000080">Vorbereitungen</font></h5>
<p>Um das eigene Projekt fit f&#252;r den Groovy-Code zu machen, muss zun&#228;chst einmal die <strong>groovy-all-1.5.4.jar</strong> in den Build-Path aufgenommen werden. In der Regel findet sich diese Library im Verzeichnis der Groovy-Installation im Ordner <em>\embeddable</em>. Verwendet man Eclipse, so funktioniert das in etwa so &#8216;<em>Project &gt; Properties &gt; Java Build Path &gt; Libraries &gt; Add External JARs&#8230;</em>&#8216;, wobei man es vorziehen sollte die Bibliothek in ein eigenes Projektverzeichnis zu kopieren (<em>/lib</em>) und von dort aus zu verlinken.</p>
<p>Theoretisch k&#246;nnte es jetzt auch schon losgehen, aber ich denke die Wenigsten wollen beim Programmieren auf lieb gewonnene Features wie z.B Syntax Highlighting verzichten. Es gibt f&#252;r die g&#228;ngigsten IDE&#8217;s bereits Groovy-Plugins und ein paar Links dazu finden sich am Ende des Beitrages, wer mit Eclipse arbeitet kann mal einen Blick <a href="http://www.communardo.de/techblog/2008/02/27/grails-projekte-mit-eclipse-entwickeln/" title="Grails Projekte mit Eclipse entwickeln">hierauf werfen</a>. Die Plugins an sich sind zwar noch nicht 100% ausgereift und Autocompletion vermisst man stellenweise auch, aber hey - ich habe vor kurzem mit dem <em>vi</em> programmiert, auch das ging <img src='http://www.communardo.de/techblog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h5><font color="#000080">Der erste Kontakt</font></h5>
<p>Um einen schnellen Einstieg zu bekommen, soll ein kleines Beispielprojekt in Form eines Autohandels den Integrationsprozess veranschaulichen. Nachfolgend findet sich ein Listing zweier Interfaces die als Schnittstelle zur Groovy-Welt dienen.</p>
<blockquote><p>package de.j2g.interfaces;</p>
<p>public interface ICar {<br />
    public String getMake();<br />
    public String getModel();<br />
    public String getType();<br />
    public double getPrice();<br />
}</p></blockquote>
<blockquote><p>package de.j2g.interfaces;</p>
<p>import java.util.ArrayList;</p>
<p>public interface IGarage {<br />
    public ArrayList&lt;ICar&gt; getCars();<br />
}</p></blockquote>
<p>Nachdem die Struktur steht, geht es an die Implementierung der Groovy-Klassen. In einem separaten Package wird die Klasse <code>Car.groovy </code>erzeugt, welche das Interface ICar implementiert:</p>
<p><!--more--></p>
<blockquote><p>package de.j2g.groovy</p>
<p>import de.j2g.interfaces.ICar;</p>
<p>class Car implements ICar {<br />
    String make<br />
    String model<br />
    String type<br />
    double price<br />
}</p></blockquote>
<p>Nein, hier wurde nicht vergessen die Methoden des Interfaces hinzuschreiben. Da Groovy die Getter- und Setter-Methoden zur bei Kompilierung selbst hinzuf&#252;gt, m&#252;ssen lediglich die Instanzvariablen definiert werden. Als N&#228;chstes kommt die Implementierung der <code>Garage.groovy</code>:</p>
<blockquote><p>package de.j2g.groovy</p>
<p>import de.j2g.interfaces.IGarage;<br />
import de.j2g.interfaces.ICar;<br />
import java.util.ArrayList;</p>
<p>class Garage implements IGarage {<br />
    public ArrayList&lt;ICar&gt; getCars() {</p>
<p>    def cars = new ArrayList&lt;ICar&gt;()</p>
<p>    def car1 = new Car()<br />
    car1.make = &#8220;Ford&#8221;<br />
    car1.model = &#8220;SHELBY GT500&#8243;<br />
    car1.type = &#8220;Sports Car&#8221;<br />
    car1.price = 89000.00</p>
<p>    def car2 = new Car()<br />
    car2.make = &#8220;Ford&#8221;<br />
    car2.model = &#8220;Taurus&#8221;<br />
    car2.type = &#8220;Full-Size&#8221;<br />
    car2.price = 21000.00</p>
<p>    cars.add(car1)<br />
    cars.add(car2)</p>
<p>    return cars<br />
    }<br />
}</p></blockquote>
<p>Der Groovy-Teil steht, jetzt fehlt noch der Aufruf aus der Java-Welt. In der Main-Klasse werden als erstes die ben&#246;tigten Groovy-Klassen &#252;ber den mitgelieferten GroovyClassLoader geladen. Da nur die Methode <code>getCars()</code> der <code>Garage.groovy </code>angesprochen wird, muss auch nur diese Klasse explizit geladen werden. Alle abh&#228;ngigen Klassen, in diesem Fall nur die <code>Car.groovy</code>, werden automatisch mitkompiliert und geladen. Ist die Klasse geladen, erzeugt man davon eine neue Instanz und castet diese auf das zuvor angelegte Interface IGarage.</p>
<blockquote><p>package de.j2g.main;</p>
<p>import groovy.lang.GroovyClassLoader;<br />
import groovy.lang.GroovyObject;</p>
<p>import java.util.ArrayList;</p>
<p>import org.codehaus.groovy.control.CompilationFailedException;</p>
<p>import de.j2g.interfaces.ICar;<br />
import de.j2g.interfaces.IGarage;</p>
<p>public class CarDealer {</p>
<p>    public static void main(String[] args) {<br />
        System.out.print(&#8221;Loading groovy classes&#8230; &#8220;);<br />
        ClassLoader parent = CarDealer.class.getClassLoader();<br />
        GroovyClassLoader loader = new GroovyClassLoader(parent);</p>
<p>        Class gGarage = null;</p>
<p>        try {<br />
            gGarage = loader.loadClass(&#8221;de.j2g.groovy.Garage&#8221;);<br />
        } catch (CompilationFailedException e) {<br />
            &#8230;<br />
        } catch (ClassNotFoundException e) {<br />
            &#8230;<br />
        }</p>
<p>        GroovyObject goGarage = null;<br />
        try {<br />
            goGarage = (GroovyObject) gGarage.newInstance();<br />
        } catch (Exception e) {<br />
            &#8230;<br />
        }</p>
<p>        System.out.println(&#8221; done!&#8221;);</p>
<p>        IGarage garage = (IGarage) goGarage;<br />
        ArrayList&lt;ICar&gt; cars = garage.getCars();</p>
<p>        for (ICar car : cars) {<br />
            System.out.print(&#8221;\n&#8221; + car.getMake() + &#8221; &#8220;);<br />
            System.out.println(car.getModel());<br />
            System.out.println(car.getPrice() + &#8221; €&#8221;);<br />
            System.out.println(car.getType());<br />
        }<br />
    }<br />
}</p></blockquote>
<p>Das Ausf&#252;hren der Main-Class sollte folgende Ausgabe auf die Konsole bringen:</p>
<p><code>    Loading groovy classes... done!</code><code> </code><code>    </code></p>
<p><code>    Ford SHELBY GT500<br />
    89000.0 €<br />
    Sports Car</code><code>    </code></p>
<p><code>    Ford Taurus<br />
    21000.0 €<br />
    Full-Size</code></p>
<h5><font color="#000080">The Power of Groovy</font></h5>
<p>Die Funktionen im oberen Beispiel h&#228;tte man sicher auch ebenso schnell in Java umsetzen k&#246;nnen. Etwas Programmieraufwand konnte aber schon bei der <code>Car.groovy </code>gespart werden - es war nicht n&#246;tig die Getter- und Setter zu definieren. Um nun die Effizienz der Skriptsprache noch etwas deutlicher zu machen, wird im Folgenden die Klasse <code>Garage.groovy </code>um einen FileReader erweitert:</p>
<p>cars.txt</p>
<p><code>    Toyota;Camry;34000;Full-Size<br />
    VW;Golf;25000;Economy</code></p>
<p>Garage.groovy</p>
<blockquote><p>public ArrayList&lt;ICar&gt; getCars() {<br />
    def cars = new ArrayList&lt;ICar&gt;()<br />
    def carFile = new File(&#8217;D:/cars.txt&#8217;)</p>
<p>    carFile.eachLine {<br />
        line -&gt;<br />
            def carArray = line.split(&#8217;;')<br />
            def car = new Car()<br />
            car.make = carArray[0]<br />
            car.model = carArray[1]<br />
            car.price = Integer.parseInt(carArray[2])<br />
            car.type = carArray[3]<br />
            cars.add(car)<br />
    }<br />
    return cars;<br />
}</p></blockquote>
<h5><font color="#000080">Fazit </font></h5>
<p>Einfacher geht es kaum noch, wenig Code zur Funktionsimplementierung und optionales Exception-Handling machen Groovy zum idealen Begleiter f&#252;r die Agile Entwicklung!</p>
<p>Groovy IDE Plugins: <a href="http://groovy.codehaus.org/Eclipse+Plugin">Eclipse</a> <a href="http://groovy.codehaus.org/IntelliJ+IDEA+Plugin">IntelliJ</a> <a href="http://groovy.codehaus.org/JEdit+Plugin">JEdit</a> <a href="http://groovy.codehaus.org/NetBeans+Plugin">Netbeans</a></p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/techblog/2008/06/02/java-projekte-mit-groovy-der-erste-kontakt/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PSQLException: operator does not exist</title>
		<link>http://www.communardo.de/techblog/2008/04/28/psqlexception-operator-does-not-exist/</link>
		<comments>http://www.communardo.de/techblog/2008/04/28/psqlexception-operator-does-not-exist/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 17:29:11 +0000</pubDate>
		<dc:creator>Alexander Buder</dc:creator>
		
		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[grails]]></category>

		<category><![CDATA[hibernate]]></category>

		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/2008/04/28/psqlexception-operator-does-not-exist/</guid>
		<description><![CDATA[<p align="left"> Nach dem Neuaufsetzen einer bestehenden Grails-Anwendung, tauchte nachfolgender Fehler w&#228;hrend der Ansprache der Datenbank durch die Applikation auf:</p>
<p align="left"><code>Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: bigint ~~ bigint<br />
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1512)<br />
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1297)<br />
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:188)<br />
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:437)<br />
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353)<br />
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:257)<br />
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:92)<br />
... 2 more</code></p>
<p align="left">Zun&#228;chst vermutete ich ein JDBC Treiber-Problem, jedoch konnte der Fehler nach etwas Recherche und Debugging auf das Object-Mapping eingegrenzt werden. Das Kernproblem lie&#223; sich dann letzendlich seitens der Datenbank bzw. deren Ansprache durch das Grails ORM identifizieren - ich hatte versehentlich eine falsche Version der PostgreSQL Datenbank installiert. Da Grails <strong>Hibernate</strong> als Persistenz-Framework verwendet (GORM) und  dieses nur Postgres bis zur Version 8.1 unterst&#252;tzt,  quittierte meine Application die meisten Datenbankoperationen mit obiger Meldung.</p>
<p align="left">Links: <a href="http://www.hibernate.org/80.html" title="Unterst&#252;tzte Datenbanken">Von Hibernate unterst&#252;tzte Datenbanken</a></p>
<p align="left">&nbsp;</p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/techblog/2008/04/28/psqlexception-operator-does-not-exist/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gr&#252;ndung der Java User Group Saxony</title>
		<link>http://www.communardo.de/techblog/2008/04/11/grundung-der-java-user-group-saxony/</link>
		<comments>http://www.communardo.de/techblog/2008/04/11/grundung-der-java-user-group-saxony/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 16:25:43 +0000</pubDate>
		<dc:creator>Torsten Rentsch</dc:creator>
		
		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[Softwareentwicklung]]></category>

		<category><![CDATA[andromda]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[jug]]></category>

		<category><![CDATA[mda]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/2008/04/11/grundung-der-java-user-group-saxony/</guid>
		<description><![CDATA[<p>Am 03. April 2008 fand das erste Treffen und damit die Gr&#252;ndungsveranstaltung der Java User Group Saxony in den R&#228;umen der Communardo Software GmbH statt. Diese Gruppe wurde auf Initiative von Torsten Rentsch (<a href="http://www.communardo.de/">Communardo Software GmbH</a>) und Falk Hartmann (<a href="http://www.ubigrate.com/">ubigrate</a>) Anfang 2008 ins Leben gerufen. Ziel ist es den Wissensaustausch im Java Umfeld zu f&#246;rdern sowie Kontakte zwischen Firmen und wissenschaftlichen Einrichtungen zu kn&#252;pfen.</p>
<p><a title="JUG Saxony Gr&#252;ndungsveranstaltung" href="http://www.communardo.de/techblog/wp-content/uploads/2008/04/img_4425.jpg"></a></p>
<p><a title="JUG Saxony Gr&#252;ndungsveranstaltung" href="http://www.communardo.de/techblog/wp-content/uploads/2008/04/img_4425.jpg"><img src="http://www.communardo.de/techblog/wp-content/uploads/2008/04/img_4425.jpg" alt="JUG Saxony Gr&#252;ndungsveranstaltung" align="middle" /></a></p>
<p>Vor 43 interessierten Teilnehmern wurde die Model Driven Architecture (MDA) vorgestellt. Herr Professor A&#223;mann (<a href="http://st.inf.tu-dresden.de/">Lehrstuhl Softwaretechnik der TU Dresden</a>) gab eine konzeptionelle Einleitung zum Thema und betrachtete dabei insbesondere den Zusammenhang zwischen MDA und Component-based Software Engineering (CBSE) (<a href="http://www.slideshare.net/jugsaxony/mda-meets-cbse/">Folien</a>).  Herr Torsten Lunze (Communardo Software GmbH) stellte mit seinem Vortrag (<a href="http://www.slideshare.net/jugsaxony/mda-mit-andromda/">Folien</a>) den Bezug zur Praxis anhand eines Beispiels aus dem Projektgesch&#228;ft her und erl&#228;uterte u.a. die Vor- und Nachteile von MDA beim Einsatz der Open Source Software AndroMDA. Beim anschlie&#223;enden Buffet blieb Zeit Kontakte zu kn&#252;pfen und das Thema im Gespr&#228;ch zu vertiefen.<br />
Mindestens einmal pro Quartal wird nun eine Veranstaltung der JUG Saxony stattfinden. Das n&#228;chste Treffen ist am 9. Juli 2008 in den R&#228;umen der TU Dresden geplant. Das Thema wird voraussichtlich EclipseLink (JPA 2.0 RI, JSR 317) sein.<br />
Gern k&#246;nnen Sie sich als Mitglied der JUG Saxony auf unserer Website <a href="http://www.jugsaxony.de/" target="_blank">http://www.jugsaxony.de</a><a href="http://www.jugsaxony.de" target="_blank"></a> registrieren. F&#252;r Anregungen und W&#252;nsche sind wir stets offen.</p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/techblog/2008/04/11/grundung-der-java-user-group-saxony/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Session Handling in Grails</title>
		<link>http://www.communardo.de/techblog/2008/04/08/session-handling-in-grails/</link>
		<comments>http://www.communardo.de/techblog/2008/04/08/session-handling-in-grails/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 14:34:48 +0000</pubDate>
		<dc:creator>Alexander Buder</dc:creator>
		
		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[grails]]></category>

		<category><![CDATA[groovy]]></category>

		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/2008/04/08/session-handling-in-grails/</guid>
		<description><![CDATA[<p>Dieser Artikel soll einen &#220;berblick &#252;ber das Session Objekt in Grails geben und L&#246;sungsm&#246;glichkeiten bei Anwendungsfehlern aufzeigen.</p>
<h5><font color="#000080">Die allgeg<font color="#000080">enw</font>&#228;rtige Session</font></h5>
<p>In allen Controllern ist die Session bereits standardm&#228;&#223;ig im Application-Scope und wartet gebrauchsfertig mit dem Namen &#8220;session&#8221; auf Verwendung. Das Objekt implementiert im wesentlichen die Standardfunktionalit&#228;t der javax.servlet.HttpSession und h&#228;lt erg&#228;nzend die Zugriffsm&#246;glichkeiten einer GroovyMap bereit.</p>
<blockquote><p>session.username = &#8216;John Doe&#8217;</p>
<p>println session["username"] oder<br />
println session.username</p></blockquote>
<p>Das Objekt selbst wird im Hintergrund &#252;ber request.getSession() initialisiert, daher hat man auch nach einem <code>session.invalidate() </code>bzw. einem Timeout beim n&#228;chsten Actionaufruf (<em>Achtung:</em> Nicht im selben Controller!) eine neue Session. Am Beispiel einer Nutzer-Authentifizierung soll der Zugriff verdeutlich werden:</p>
<blockquote><p>//Im Interceptor ist die Authentifizierung definiert, die vor jeder Action ausgef&#252;hrt werden soll<br />
def beforeInterceptor = [action:this.&amp;auth,except:'login']</p>
<p>//Falls kein Nutzer in der Session gefunden wird, erfolgt eine Weiterleitung zur Login-Action<br />
def auth() {<br />
  if(!session.user) {<br />
    redirect(action:&#8217;login&#8217;)<br />
    return false<br />
  }<br />
}<br />
def login = {<br />
    // zeige Login-Seite<br />
}</p></blockquote>
<h5><font color="#000080">Session Timeouts</font></h5>
<p>Wie oben bereits angesprochen, muss man sich kein neues Session Objekt nach einem Timeout besorgen. Leider hat dieser Mechanismus aber den Nachteil, dass man dadurch nicht merkt ob eine neue Session durch den Timeout einer Vorhergehenden erzeugt wurde und R&#252;ckschl&#252;sse darauf lassen nur eine neue ID und die fehlenden Session-Attribute zu.</p>
<p><!--more--></p>
<p><em>Braucht ein Nutzer z.B. zu lange um eine Formular auszuf&#252;llen, bekommt er beim n&#228;chsten Klick den Zugriff verweigert oder der aktuelle Bearbeitungssatus wird zur&#252;ckgesetzt. Sicher ist dies in den meisten F&#228;llen eines Session-Timeouts der Fall, aber hier ist der unberechtigte Zugriff mit dem Timeout gleichgesetzt und der Nutzer kann schlecht explizit auf eine abgelaufene Session hingewiesen werden.</em></p>
<p>Eine M&#246;glichkeit herauszufinden ob die aktuelle Session noch existiert und eine entsprechende Meldung auszugeben, w&#228;re einen Parameter zu setzen und diesen vor einer Action abzufragen:</p>
<blockquote><p>static beforeInterceptor = [action:this&amp;checkSession, except:'login']</p>
<p>def checkSession = {<br />
  if(!session.timeout)<br />
  render(&#8221;Session Timeout!&#8221;)<br />
}</p></blockquote>
<h5><font color="#000080">AfterInterceptor Verwendung</font></h5>
<p>Die M&#246;glichkeiten eines Interceptors sind vielf&#228;ltig, sollten aber gerade bei Ausf&#252;hrung nach Methodenaufrufen mit bedacht eingesetzt werden.</p>
<p><em>Beispiel: Man definiert in einer Basisklasse den Zugriff auf die Session per AfterInterceptor (z.B. f&#252;r einen Logger) und leitet diese dann in einem Controller ab. In einer neuen Action wird nun die Session ung&#252;ltig gemacht und als Ergebnis l&#246;st der Aufruf der Session-Variable im Interceptor automatisch eine <code>IllegalStateException</code> aus.</em></p>
<p>Dieser Aufruf kann auch schon die blosse Ausgabe der Session sein, da das Objekt im Controller nicht mehr exisiert. Im nachfolgenden Codeauszug wird der eben beschriebene Fall veranschaulicht:</p>
<blockquote><p>class BasisController {<br />
  def afterInterceptor = {       <br />
    //wirft eine IllegalStateException<br />
    println session<br />
  }<br />
  &#8230;<br />
}</p>
<p>class UserInterface extends BasisController {<br />
//Erzeugt nach dem render eine IllegalStateException<br />
  def logout = {<br />
     session.invalidate()<br />
     render(view:&#8217;logout&#8217;)<br />
  }<br />
}</p></blockquote>
<p>Ein Workaround w&#228;re, im Interceptor nicht die Session-Variable des Controller zu nutzen. Stattdessen sollte man die Session direkt aus dem Request holen:</p>
<blockquote><p>class BasisController {<br />
  def afterInterceptor = {        <br />
    //gibt die Session aus oder null, wenn diese ung&#252;ltig wurde<br />
    println request.getSession(false)<br />
  }<br />
  &#8230;<br />
}</p></blockquote>
<h5><font color="#000080">Zugriffe ohne Session</font></h5>
<p>Ein gro&#223;er Nachteil der automatischen Sessionvergabe war bislang auch die Tatsache, dass bei einzelnen Controlleraufrufen (z.B. durch einen externen Service), ebenfalls eine Session erzeugt wurde, obwohl diese gar nicht ben&#246;tigt wurde. So hatte man bei einem Aufruf durch einen Webservice nach jedem Request immer eine Session, welche unbenutzt auf den Timeout wartete.</p>
<p>Seit Grails 1.0.1 wird nur nach der expliziten Nutzung des Session Objektes im Controller eine neue Session angelegt. Siehe dazu <a href="http://jira.codehaus.org/browse/GRAILS-1238">http://jira.codehaus.org/browse/GRAILS-1238</a>.</p>
<blockquote></blockquote>
]]></description>
		<wfw:commentRss>http://www.communardo.de/techblog/2008/04/08/session-handling-in-grails/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
