<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-414931709954865720</id><updated>2011-11-28T01:37:06.269+01:00</updated><category term='App Engine'/><category term='MyFaces'/><category term='JasperReports'/><category term='Grails'/><category term='JSF'/><category term='JMeter'/><category term='Facelets'/><category term='Exceptions'/><category term='JAXB'/><category term='Eclipse'/><category term='gaelyk'/><category term='Richfaces'/><title type='text'>J5EE / Grails / Google App Engine</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-1002556901169968804</id><published>2011-09-05T13:24:00.000+02:00</published><updated>2011-09-05T13:24:37.063+02:00</updated><title type='text'>Preise bei Amazon beobachten / überwachen</title><content type='html'>Eine weitere Anwendung, die mit gaelyk erstellt wurde, ist nun online: &lt;a href="http://www.preiswaechter.com/"&gt;Preiswächter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mit dem Preiswächter können die Preise verschiedener Artikel bei Amazon beobachtet werden. Fällt ein Preis unter den gewünschten Wert, versendet die Anwendung eine Benachrichtigungsmail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-1002556901169968804?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/1002556901169968804/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2011/09/preise-bei-amazon-beobachten-uberwachen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/1002556901169968804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/1002556901169968804'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2011/09/preise-bei-amazon-beobachten-uberwachen.html' title='Preise bei Amazon beobachten / überwachen'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-3201644141346683773</id><published>2011-01-11T19:16:00.002+01:00</published><updated>2011-01-11T19:19:24.614+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gaelyk'/><category scheme='http://www.blogger.com/atom/ns#' term='App Engine'/><title type='text'>Erste App mit gaelyk online</title><content type='html'>Nachdem die Kombination Grails und GAE mir öfters Probleme bereitet hat, habe ich Framework &lt;a href="http://gaelyk.appspot.com/"&gt;gaelyk&lt;/a&gt; ausprobiert.&lt;br /&gt;&lt;br /&gt;Als erstes Projekt entstand dabei eine Seite zur Planung von Hochzeiten:&amp;nbsp;&lt;a href="https://hochzeitschecker.appspot.com/" target="_blank"&gt;Hochzeitsplaner&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Vielleicht hilft diese ja dem ein oder anderen bei der Planung :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-3201644141346683773?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/3201644141346683773/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2011/01/erste-app-mit-gaelyk-online.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/3201644141346683773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/3201644141346683773'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2011/01/erste-app-mit-gaelyk-online.html' title='Erste App mit gaelyk online'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-2471208944625160802</id><published>2010-09-24T17:35:00.000+02:00</published><updated>2010-09-24T17:35:09.193+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails i18n und die GAE</title><content type='html'>Momentan scheint es mit dem aktuellen app-engine Plugin (0.8.10) für Grails ein paar Probleme bezüglich der Internationalisierung zu geben.&lt;br /&gt;&lt;br /&gt;Bindet man in die Seite das Tag g:message&lt;br /&gt;&lt;br /&gt;&amp;lt;g:message code="hallo.welt" /&amp;gt;&lt;br /&gt;&lt;br /&gt;ein und definiert in der messages.properties (bzw. in der entsprechenden Lokalisierung davon) einen passenden Key&lt;br /&gt;&lt;br /&gt;hallo.welt=Hallo Welt !&lt;br /&gt;&lt;br /&gt;wird beim lokalen starten der Applikation noch alles richtig angezeigt und auf der Webseite erscheint der Text "Hallo Welt!". Wird die Anwendung jedoch auf die App Engine deployt, erscheint an derselben Stelle nur noch "hallo.welt"&lt;br /&gt;&lt;br /&gt;Um dieses Problem zu lösen, kann man die BootStrap.groovy um folgendes erweitern:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class BootStrap {&lt;br /&gt;&amp;nbsp;def messageSource&lt;br /&gt;&lt;br /&gt;&amp;nbsp; def init = { servletContext -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; messageSource.basenames = [ 'WEB-INF/grails-app/i18n/messages' ]&lt;br /&gt;&amp;nbsp;&amp;nbsp; messageSource.clearCache()   &lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; def destroy = {&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Dadurch werden die Namen der property-Dateien, in denen die Keys stehen nochmal neu gesetzt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-2471208944625160802?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/2471208944625160802/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2010/09/grails-i18n-und-die-gae.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/2471208944625160802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/2471208944625160802'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2010/09/grails-i18n-und-die-gae.html' title='Grails i18n und die GAE'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-6396015983848451589</id><published>2010-08-22T13:08:00.052+02:00</published><updated>2011-09-25T10:30:04.722+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JMeter'/><title type='text'>Lasttests mit JMeter für Webanwendungen</title><content type='html'>&lt;a href="http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi"&gt;JMeter &lt;/a&gt;ist ein Tool der Apache Software Foundation, mit dem sich u.a. Lasttests und Performancemessungen für Webanwendungen erstellen lassen. &lt;br /&gt;&lt;br /&gt;Nach dem Runterladen und Entpacken des Tools lässt es sich mit der /bin/jmeter.bat starten.&amp;nbsp; &lt;br /&gt;Um einen Test zu erstellen, muss in den - noch leeren - Testplan eine &lt;b&gt;Thread-Gruppe&lt;/b&gt; hinzugefügt werden.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_ADGgAQNcq-g/TG5uVWV__YI/AAAAAAAAAEM/ieKMrrN5_rg/s1600/jmeter.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="142" src="http://1.bp.blogspot.com/_ADGgAQNcq-g/TG5uVWV__YI/AAAAAAAAAEM/ieKMrrN5_rg/s400/jmeter.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;Eine &lt;b&gt;Thread-Gruppe&lt;/b&gt; simuliert eine Menge von Benutzern. Ist diese erstellt, können in den Thread-Eigenschaften die Anzahl der zu simulierenden Benutzer über die Eigenschaft&lt;i&gt; &lt;/i&gt;&lt;b&gt;Anzahl der Threads&lt;/b&gt; festgelegt werden.&lt;br /&gt;&lt;span style="color: #660000;"&gt;Die &lt;/span&gt;&lt;b style="color: #660000;"&gt;Ramp-Up Period&lt;/b&gt;&lt;span style="color: #660000;"&gt; gibt an, innerhalb wieviel Sekunden JMeter die gewünsche Anzahl von Threads starten soll.&lt;/span&gt;&lt;br /&gt;Bei 5 Threads und einer Ramp-Up Period von 5 wird also jede Sekunde ein neuer Thread gestartet. Wird die Period auf 10 gesetzt, wird alle 2 Sekunden ein neuer Thread gestartet. Dies ist ein wichtiger Wert zum skalieren der Tests.&lt;br /&gt;&lt;br /&gt;Für &lt;b&gt;Lasttests &lt;/b&gt;ist dieser Wert möglichst klein &lt;b&gt;(0-2&lt;/b&gt;) zu wählen, da hierbei möglichst viele Benutzer gleichzeitig simuliert werden sollen.&lt;br /&gt;&lt;br /&gt;Sollen nur &lt;b&gt;Reaktionszeiten &lt;/b&gt;der Anwendung für einzelne Benutzer getestet werden ist dieser Wert entsprechend hoch zuwählen, so dass sich die Anfragen nicht zu sehr überlappen. Wie hoch genau der Wert dabei sein muss, hängt natürlich von der zu testenden Funktion der Anwendung ab. Soll nur die Reaktionszeit einer statischen Webseite überprüft werden, reicht es sicherlich aus, die &lt;b&gt;Ramp-Up Period = 2x(Anzahl der Threads)&lt;/b&gt; zu setzen, da 2 Sekunden als Antwortzeit durchaus ausreichend ist. Sollen aber Funktionen der Anwendung getestet werden, die Berechnungen durchführen, auf Datenbanken zugreifen oder sonstiges, muss die Dauer dieser Funktionbei Wahl der Zeit mit berücksichtigt werden, so dass sich hierbei die Ramp-Up Period vergrößert.&lt;br /&gt;&lt;br /&gt;Unterhalb der Thread-Gruppe können jetzt die gewünschten Anfragen an die Webanwendung plaziert werden. Diese werden als &lt;b&gt;HTTP Request HTTPClient&lt;/b&gt; (zu finden unter Hinzufügen -&amp;gt; Sampler) unter die Thread-Gruppe platziert. Für das Request können dann die notwendigen Einstellungen wie Server - IP, Port und Request - Pfad gemacht werden. Zusätzlich können dem Request auch noch Parameter übergeben werden, was ganz nützlich sein kann, wenn Methoden aufgerufen werden sollen, die Parameter verwenden.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ADGgAQNcq-g/THOzXszn7LI/AAAAAAAAAEU/SK_C4xIDA6c/s1600/http.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="181" src="http://3.bp.blogspot.com/_ADGgAQNcq-g/THOzXszn7LI/AAAAAAAAAEU/SK_C4xIDA6c/s400/http.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In meinem Beispiel befindet sich auf der testme.xhtml ein Binding zu einer JSF ManagedBean - Methode, die eine Anfrage an die Datenbank startet.&lt;br /&gt;&lt;br /&gt;Zuletzt wird noch ein &lt;b&gt;Graph &lt;/b&gt;(zu finden unter Hinzufügen -&amp;gt; Listener) unter dem Http Request plaziert, um die Testergebnisse visuell darzustellen. An diesem müssen keine Einstellungen mehr vorgenommen werden.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ADGgAQNcq-g/THO0pFXgC_I/AAAAAAAAAEc/QSHGCJdyNLQ/s1600/graph.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" src="http://2.bp.blogspot.com/_ADGgAQNcq-g/THO0pFXgC_I/AAAAAAAAAEc/QSHGCJdyNLQ/s400/graph.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Der Test kann über den Menüpunkt &lt;i&gt;Start&lt;/i&gt; gestartet werden, die Ergebnisse / Zeiten erscheinen in dem Graph. Je nach Bedarf können auch mehrere Thread Gruppen definiert werden, die entweder parallel (ist per default eingestellt) oder nacheinander gestartet werden. Um sie nacheinander starten zu lassen, muss ein Haken bei &lt;i&gt;Thread-Gruppen nacheinander starten&lt;/i&gt; gesetzt werden. Dies ist direkt unter dem Testplan zu finden.&lt;br /&gt;&lt;br /&gt;Buchtip:&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/3540245391/ref=as_li_ss_tl?ie=UTF8&amp;tag=wwwsiekmoel0d-21&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=3540245391"&gt;Handbuch zum Testen von Web-Applikationen: Testverfahren, Werkzeuge, Praxistipps (Xpert.press)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.de/e/ir?t=wwwsiekmoel0d-21&amp;l=as2&amp;o=3&amp;a=3540245391" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-6396015983848451589?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/6396015983848451589/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2010/08/lasttests-mit-jmeter-fur-webanwendungen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/6396015983848451589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/6396015983848451589'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2010/08/lasttests-mit-jmeter-fur-webanwendungen.html' title='Lasttests mit JMeter für Webanwendungen'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ADGgAQNcq-g/TG5uVWV__YI/AAAAAAAAAEM/ieKMrrN5_rg/s72-c/jmeter.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-2358919851568400571</id><published>2010-08-11T19:40:00.002+02:00</published><updated>2010-08-11T19:50:56.454+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='JasperReports'/><title type='text'>GAE und JasperReports</title><content type='html'>Nachdem ich nun einige Applikationen auf der Google App Engine entwickelt habe, wollte ich &lt;a href="http://jasperforge.org/"&gt;JasperReports&lt;/a&gt; in eine Anwendung einbinden, um PDF Ausgaben zu erzeugen.&lt;br /&gt;&lt;br /&gt;Leider benötigt JasperReports die Klasse java.awt.GraphicsEnvironment und diese ist nicht mit auf der &lt;a href="http://code.google.com/intl/de-DE/appengine/docs/java/jrewhitelist.html"&gt;Whitelist&lt;/a&gt; der verfügbaren JRE Klassen. Aus diesem Grund kommt es zu folgender Fehlermeldung:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;java.lang.NoClassDefFoundError: java.awt.GraphicsEnvironment is a restricted class.&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Das &lt;a href="http://code.google.com/p/googleappengine/issues/detail?id=1423"&gt;Issue 1423&lt;/a&gt; fordert, diese Klasse in der Whitelist aufzunehmen. &lt;br /&gt;Bis es soweit ist, ist die Nutzung von JasperReport auf der GAE &lt;b&gt;nicht möglich.&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-2358919851568400571?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/2358919851568400571/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2010/08/gae-und-jasperreports.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/2358919851568400571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/2358919851568400571'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2010/08/gae-und-jasperreports.html' title='GAE und JasperReports'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-4101573323434660336</id><published>2010-07-28T18:17:00.002+02:00</published><updated>2010-07-28T18:21:38.458+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JAXB'/><category scheme='http://www.blogger.com/atom/ns#' term='Exceptions'/><title type='text'>JAXB und das @XmlRootElement</title><content type='html'>JAXB wird verwendet um aus einem XML Schema Java Klassen zu erstellen. Diese können dann mit Daten gefüllt und als XML - Datei abgespeichert werden. Andersrum können auch bestehende XML - Dateien in Java Klassen umgewandelt werden.&lt;br /&gt;Je nach Schemadefinition ergibt sich dabei allerdings ein Problem.&lt;br /&gt;&lt;br /&gt;Der folgende Ausschnitt beschreibt ein einfaches Schema:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;xs:schema targetnamespace="http://test.kirchner.de/jaxb" &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlns:xs="http://www.w3.org/2001/XMLSchema"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:element name="start"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:complextype&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;/xs:complextype&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:element&amp;gt;&lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;JAXB erstellt daraus diese Klasse, die im Package test.kirchner.de.jaxb untergebracht wird:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@XmlRootElement(name = "start")&lt;br /&gt;public class Start {&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Das folgende Schema beschreibt dieselbe XML Struktur, nur das dem &lt;i&gt;start&lt;/i&gt; Element jetzt ein Typ über das type Attribut zugeordnet wird und dieser nicht innerhalb des Elements deklariert wurde:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlns:mk="http://test.kirchner.de/jaxb" &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;targetNamespace="http://test.kirchner.de/jaxb"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xs:element name="start" type="mk:startType"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xs:complexType name="startType"/&amp;gt;&lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Hieraus wird von JABX jedoch folgendes erstellt:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@XmlType(name = "startType")&lt;br /&gt;public class StartType {&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;In der zugehörigen ObjectFactory wird zum Erzeugen eines &lt;i&gt;start&lt;/i&gt; Elements die folgende Methode zur Verfügung gestellt:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@XmlRegistry&lt;br /&gt;public class ObjectFactory {&lt;br /&gt;&amp;nbsp;&amp;nbsp;private final static QName _Start_QNAME = &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new QName("http://test.kirchner.de/jaxb", "start");&lt;br /&gt;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;@XmlElementDecl(namespace = "http://test.kirchner.de/jaxb", &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = "start")&lt;br /&gt;&amp;nbsp;&amp;nbsp;public JAXBElement&lt;starttype&gt; createStart(StartType value) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return new JAXBElement&lt;starttype&gt;(_Start_QNAME, StartType.class, null, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt; &lt;br /&gt;Daraus ergibt sich nun aber das Problem, dass &lt;b&gt;kein XmlRootElement&lt;/b&gt; definiert ist und der Versuch die Java Klassen mit dem Marshaller als XML Datei zu speichern schlägt fehl. Die hervorgehobene Zeile führt zu einer &lt;b&gt;javax.xml.bind.MarshalException&lt;/b&gt; &lt;br /&gt;&lt;code&gt;&lt;br /&gt;JAXBElement&lt;starttype&gt; list = (new ObjectFactory()).createStart(new StartType());&lt;br /&gt;StartType root = list.getValue();&lt;br /&gt;JAXBContext jaxbContext = JAXBContext.newInstance("test.kirchner.de.jaxb");&lt;br /&gt;Marshaller m = jaxbContext.createMarshaller();&lt;br /&gt;&lt;b&gt;m.marshal(root, new File("d:/start.xml"));&lt;/b&gt;&lt;br /&gt;&lt;/starttype&gt;&lt;/code&gt;&lt;br /&gt;Ausschnitt aus dem Stacktrace:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#javax.xml.bind.MarshalException&lt;br /&gt;- with linked exception:&lt;br /&gt;[com.sun.istack.SAXException2: unable to marshal type "test.kirchner.de.jaxb.StartType" as an element because it is missing an @XmlRootElement annotation]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Abhilfe schaffen lässt sich, indem man im Schema folgendes hinzufügt:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;jaxb:globalBindings&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xjc:simple/&amp;gt;&lt;br /&gt;&amp;lt;/jaxb:globalBindings&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Das komplette XSD sieht somit wie folgt aus:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mk="http://test.kirchner.de/jaxb" targetNamespace="http://test.kirchner.de/jaxb" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="1.0" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:appinfo&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;jaxb:globalBindings&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xjc:simple/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/jaxb:globalBindings&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:appinfo&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:element name="start" type="mk:startType"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:complexType name="startType"/&amp;gt;&lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Durch die &lt;b&gt;xjc:simple&lt;/b&gt; wird von JAXB wieder die Start Klasse mit der @XmlRootElement Notation erzeugt.&lt;br /&gt;&lt;br /&gt;Siehe auch: &lt;a href="http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html"&gt;den Blog von Kohsuke Kawaguchi&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-4101573323434660336?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/4101573323434660336/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2010/07/jaxb-und-das-xmlrootelement.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/4101573323434660336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/4101573323434660336'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2010/07/jaxb-und-das-xmlrootelement.html' title='JAXB und das @XmlRootElement'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-3405120385228547791</id><published>2010-07-22T17:34:00.004+02:00</published><updated>2011-09-25T10:34:36.983+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MyFaces'/><category scheme='http://www.blogger.com/atom/ns#' term='Facelets'/><category scheme='http://www.blogger.com/atom/ns#' term='Richfaces'/><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><title type='text'>Webanwendung mit JSF (MyFaces), Facelets und Richfaces</title><content type='html'>Im folgenden wird beschrieben welche Bibliotheken und Einstellungen notwendig sind, um eine JSF - fähig Webanwendung für einen JBoss Server 5.1.0 zu erstellen. Als JSF Implementierung wird dabei MyFaces gewählt. Zusätzlich sollen noch Facelets und Richfaces unterstützt werden.&lt;br /&gt;&lt;br /&gt;Folgende Versionen werden dabei verwendet: (In späteren Auflistungen von Bibliotheken werden alle Versionsnummern weggelassen)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MyFaces 1.2.8&lt;/li&gt;&lt;li&gt;Facelets 1.1.15.B1 &lt;/li&gt;&lt;li&gt;Richfaces 3.3.2&lt;/li&gt;&lt;/ul&gt;Um eine leere Webanwendung zu Erstellen wird Eclipse verwendet. Dort kann über&lt;br /&gt;&lt;i&gt;File --&gt; New --&gt; Dynamic Web Project (oder File --&gt; New --&gt; Other und dann unter Web/Dynamic Web Project) &lt;/i&gt; eine entsprechende Anwendung erstellt werden. (Als Servlet Version 2.5 angeben)&lt;br /&gt;Die JSF Unterstützung kann ebenfalls über Eclipse hinzugefügt werden, da ich jedoch lieber selber eine Übersicht habe, welche Dateien wo erstellt werden, wird hier beschrieben, wie sie &lt;i&gt;per Hand&lt;/i&gt; hinzugefügt wird.&lt;h2 style="font-size:14px;"&gt;JSF Unterstützung hinzufügen&lt;/h2&gt;Die wichtigste Konfigurationsdatei für JSF ist die &lt;i&gt;faces-config-xml&lt;/i&gt;. Diese Datei wird im Ordner &lt;b&gt;WEB-INF&lt;/b&gt; erstellt.In der einfachsten Form sieht diese wie folgt aus:&lt;br /&gt;&lt;br /&gt;&amp;lt;faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee" xi="http://www.w3.org/2001/XInclude" xsi="http://www.w3.org/2001/XMLSchema-instance" schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"&amp;gt;&lt;br /&gt;&amp;lt;/faces-config&amp;gt;&lt;br /&gt;&lt;br /&gt;Nachdem dies geschehen ist, muss die &lt;b&gt;web.xml&lt;/b&gt; noch angepasst werden:&lt;br /&gt;&lt;br /&gt;Um JSF zu verwenden wird das Faces Servlet eingebunden. Zusätzlich werden noch die passenden Mappings für das Servlet hinzugefügt.&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/faces/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;*.xhtml&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;Soll in der Webanwendung z.B. mit xhtml Seiten gearbeitet werden, wird als Mapping *.xhtml angegeben.&lt;br /&gt;&lt;br /&gt;Das Mapping von /faces/* ist wichtig, da einige Bibliotheken, die ich einbinde (z.B. Richfaces), bestimmte Resourcen über den Kontextpfad .../faces/... schickt.&lt;br /&gt;&lt;br /&gt;Diese Angaben reichen aus, um der Webanwendung JSF &lt;i&gt;beizubringen&lt;/i&gt;. Allerdings wird dann die Default - Implementierung des Servers für JSF verwendet, was im Falle von JBoss die SUN-RI Implemetierung ist.&lt;br /&gt;&lt;h2 style="font-size:14px;"&gt;MyFaces Implementierung verwenden&lt;/h2&gt;Um die MyFaces Implementierung von JSF zu verwenden, müssen folgende Dateien in den &lt;b&gt;WEB-INF/lib&lt;/b&gt; Ordner kopiert werden (Download auf &lt;a href="http://myfaces.apache.org/" target="_blank"&gt;MyFaces&lt;/a&gt;).&lt;br /&gt;&lt;ul&gt;&lt;li&gt;myfaces-impl&lt;/li&gt;&lt;li&gt;myfaces-api&lt;/li&gt;&lt;li&gt;commons-beanutils&lt;/li&gt;&lt;li&gt;commons-codec&lt;/li&gt;&lt;li&gt;commons-collections&lt;/li&gt;&lt;li&gt;commons-digester&lt;/li&gt;&lt;li&gt;commons-discovery&lt;/li&gt;&lt;li&gt;commons-logging&lt;/li&gt;&lt;/ul&gt;Nachdem diese Dateien in den Ordner kopiert wurden, müssen noch folgende Angaben der &lt;b&gt;web.xml&lt;/b&gt; hinzugefügt werden:&lt;br /&gt;&lt;br /&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;MyFaces&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;br /&gt;Der Context Parameter sorgt dafür, dass der JBos Server für diese Web Anwendung die JSF Implementierung nimmt, die im WEB-INF/lib Ordner liegt.&lt;br /&gt;Zusätzlich muss noch der folgende Listener eingebunden werden:&lt;br /&gt;&lt;br /&gt;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;lt;listener-class&amp;gt;org.apache.myfaces.webapp.StartupServletContextListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;Mit diesen Einstellungen verwendet die Webanwendung ab sofoert die Myfaces Implementierung.&lt;br /&gt;&lt;h2 style="font-size:14px;"&gt;Facelets hinzufügen&lt;/h2&gt;Die jar Datei zu Facelets kann &lt;a href="https://facelets.dev.java.net/" target="_blank"&gt;hier&lt;/a&gt; runtergeladen werden. Um Facelets einzubinden, muss nur die folgende Datei in den WEB-INF/lib ordner kopiert werden:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;jsf-facelets.jar&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In der &lt;b&gt;web.xml&lt;/b&gt; muss der folgende Context-Parameter hinzugefügt werden:&lt;br /&gt;&lt;br /&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;javax.faces.DEFAULT_SUFFIX&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;.xhtml&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;br /&gt;Als &lt;i&gt;param-value&lt;/i&gt; wird dabei dieselbe Endung angegeben, die zuvor bereits für das Mapping des Faces Servlets verwendet wurde.&lt;br /&gt;&lt;br /&gt;Des Weiteres muss in der &lt;b&gt;faces-config.xml&lt;/b&gt; ein ViewHandler für facelets eingetragen werden. dazu wird unter dem faces-config Tag folgendes eingefügt:&lt;br /&gt;&lt;br /&gt;&amp;lt;application&amp;gt;&lt;br /&gt;&amp;lt;view-handler&amp;gt;com.sun.facelets.FaceletViewHandler&amp;lt;/view-handler&amp;gt;&lt;br /&gt;&amp;lt;/application&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Achtung:&lt;/b&gt;&lt;/u&gt; Wird vergessen der ViewHandler hinzuzufügen, kommt es beim Aufrufen einer *.xhtml Seite aus der Webanwendung zu einem Stackoverflow:&lt;br /&gt;&lt;br /&gt;Servlet.service() for servlet Faces Servlet threw exception&lt;br /&gt;java.lang.StackOverflowError&lt;br /&gt;at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)&lt;br /&gt;...&lt;br /&gt;--&gt; View Handler in faces-config.xml angeben!&lt;br /&gt;&lt;h2 style="font-size:14px;"&gt;Richfaces hinzufügen&lt;/h2&gt;Die Richfaces Bibliotheken können &lt;a href="http://jboss.org/richfaces/download/stable.html" target="_blank"&gt;hier&lt;/a&gt; runtergeladen werden. Folgende Dateien müssen in den WEB-INF/lib Ordner kopiert werden:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;richfaces-api&lt;/li&gt;&lt;li&gt;richfaces-impl&lt;/li&gt;&lt;li&gt;richfaces-ui&lt;/li&gt;&lt;/ul&gt;Um Richfaces in die Anwendung einzubinden, müssen noch folgende Einträge in der &lt;b&gt;web.xml&lt;/b&gt; gemacht werden:&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;display-name&amp;gt;RichFaces Filter&amp;lt;/display-name&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;richfaces&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.ajax4jsf.Filter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;richfaces&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;INCLUDE&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;Fertig ist die Webapplikation !&lt;br /&gt;&lt;br /&gt;Buchtip für Anwendungen mit JSF 2.0:&lt;br /&gt;&lt;a href="http://www.amazon.de/gp/product/3898646068/ref=as_li_ss_tl?ie=UTF8&amp;tag=wwwsiekmoel0d-21&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=3898646068"&gt;JavaServer Faces 2.0: Grundlagen und erweiterte Konzepte&lt;/a&gt;&lt;img src="http://www.assoc-amazon.de/e/ir?t=wwwsiekmoel0d-21&amp;l=as2&amp;o=3&amp;a=3898646068" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-3405120385228547791?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/3405120385228547791/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2010/07/webanwendung-mit-jsf-myfaces-facelets.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/3405120385228547791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/3405120385228547791'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2010/07/webanwendung-mit-jsf-myfaces-facelets.html' title='Webanwendung mit JSF (MyFaces), Facelets und Richfaces'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-8218604220686810949</id><published>2009-12-29T11:40:00.005+01:00</published><updated>2010-07-28T18:23:05.364+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='Exceptions'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails App Engine Ant-Macro Exception</title><content type='html'>Die DataNucleus EnhancerTask der App Engine macht mir in meinen Grails Projekten relativ häufig Probleme. Das ganze sieht so aus, dass ich beim kompilieren der sourcen auf folgende Fehlermeldung stoße:&lt;br /&gt;&lt;br /&gt;C:\Programmier-Tools\appengine-java-sdk-1.3.0\config\user\ant-macros.xml:95: java.io.IOException: Cannot run program "C:\Program Files\Java\jdk1.6.0_14\jre\bin\java.exe": CreateProcess error=87, Falscher Parameter&lt;br /&gt;gant.TargetExecutionException: : The following error occurred while executing this line:&lt;br /&gt;C:\Programmier-Tools\appengine-java-sdk-1.3.0\config\user\ant-macros.xml:95: java.io.IOException: Cannot run program "C:\Program Files\Java\jdk1.6.0_14\jre\bin\java.exe": CreateProcess error=87, Falscher Parameter&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;Caused by: C:\Programmier-Tools\appengine-java-sdk-1.3.0\config\user\ant-macros.xml:95: java.io.IOException: Cannot run program "C:\Program Files\Java\jdk1.6.0_14\jre\bin\java.exe":&lt;span style="font-weight: bold;"&gt; CreateProcess error=87, Falscher Parameter&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; at org.apache.tools.ant.taskdefs.Java.fork(Java.java:774)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:194)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        at org.apache.tools.ant.taskdefs.Java.execute(Java.java:104)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        at com.google.appengine.tools.enhancer.EnhancerTask.execute(EnhancerTask.java:99)&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Diesen Fehler kann man beheben, wenn man in der ant-marcos.xml, die sich im $APPENGINE_HOME$/config/user Verzeichnis befindet, eine Anpassung in der macrodef "enhance_war" vornimmt. Diese beginnt (in der Version 1.3.0) in der Zeile 90.&lt;br /&gt;In der macrodef wird folgendes fileset definiert (Z.102):&lt;br /&gt;&lt;fileset dir="@{war}/WEB-INF/classes" includes="**/*.class"&gt;&lt;br /&gt;&amp;lt;fileset dir="@{war}/WEB-INF/classes" includes="**/*.class"/&amp;gt;&lt;br /&gt;&lt;br /&gt;Wenn wir dieses fileset auf die Klassen für unsere Anwendung einschränken, dann taucht die Fehlermeldung nichtmehr auf und das kompilieren und enhancen der Domain Klassen läuft wieder durch.&lt;br /&gt;&lt;br /&gt;Liegen die Klassen unserer Anwendung also in einem Package de.myproject, dann sieht das fileset folgendermaßen aus:&lt;br /&gt;&lt;fileset dir="@{war}/WEB-INF/classes/de/myproject" includes="**/*.class"&gt;&lt;br /&gt;&lt;/fileset&gt;&lt;/fileset&gt;&amp;lt;fileset dir="@{war}/WEB-INF/classes/de/myproject" includes="**/*.class"/&amp;gt;&lt;br /&gt;&lt;fileset dir="@{war}/WEB-INF/classes" includes="**/*.class"&gt;&lt;fileset dir="@{war}/WEB-INF/classes/de/myproject" includes="**/*.class"&gt;&lt;br /&gt;Achtung: Nicht vergessen diese Zeile bei einer neuen Version des App-Engine SDKs wieder anzupassen!&lt;/fileset&gt;&lt;/fileset&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-8218604220686810949?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/8218604220686810949/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2009/12/grails-app-engine-ant-macro-exception.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/8218604220686810949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/8218604220686810949'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2009/12/grails-app-engine-ant-macro-exception.html' title='Grails App Engine Ant-Macro Exception'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-6354846043179533779</id><published>2009-09-07T22:33:00.006+02:00</published><updated>2010-07-28T18:22:42.031+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Update der App Engine Version innerhalb eines Grails Projekts</title><content type='html'>Da ja in regelmäßigen, recht kurzen Abständen immer mal wieder eine neue App Engine Version zum download bereit steht, empfiehlt es sich auch auf seinem Entwicklungsrechner immer die entsprechende Version zu haben.&lt;br /&gt;&lt;br /&gt;Allerdings ist es mit neuer Version runterladen und den Pfad zum &lt;span style="font-weight: bold;"&gt;APPENGINE_HOME&lt;/span&gt; anpassen nicht unbedingt getan, denn mein Grails Projekt wollte sich danach mit folgender begründung nichtmehr starten lassen:&lt;br /&gt;&lt;br /&gt;\appengine-java-sdk-1.2.5\config\user\ant-macros.xml:94: Java returned: 1&lt;br /&gt;at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:331)&lt;br /&gt;at gant.Gant$_dispatch_closure6.doCall(Gant.groovy:334)&lt;br /&gt;at gant.Gant$_dispatch_closure6.doCall(Gant.groovy)&lt;br /&gt;at gant.Gant.withBuildListeners(Gant.groovy:344)&lt;br /&gt;at gant.Gant.this$2$withBuildListeners(Gant.groovy)&lt;br /&gt;at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)&lt;br /&gt;at gant.Gant.dispatch(Gant.groovy:334)&lt;br /&gt;at gant.Gant.this$2$dispatch(Gant.groovy)&lt;br /&gt;at gant.Gant.invokeMethod(Gant.groovy)&lt;br /&gt;at gant.Gant.processTargets(Gant.groovy:495)&lt;br /&gt;at gant.Gant.processTargets(Gant.groovy:480)&lt;br /&gt;at grails.util.GrailsMain.run(GrailsMain.groovy:31)&lt;br /&gt;at grails.util.GrailsMain.main(GrailsMain.groovy)&lt;br /&gt;Error executing script AppEngine: No such property: appEngineSDK for class:&lt;br /&gt;AppEngine&lt;br /&gt;gant.TargetMissingPropertyException: No such property: appEngineSDK for&lt;br /&gt;class: AppEngine&lt;br /&gt;at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:329)&lt;br /&gt;&lt;br /&gt;und noch vieles mehr...&lt;br /&gt;&lt;br /&gt;Ein clean in Eclipse hat nicht ausgereicht und das Löschen des classes und stage Ordners in ../.grails/1.1.1/projects/myproject hat auch nix gebracht.&lt;br /&gt;Erst als ich den gesamten Ordner einmal gelöscht hatte und das App-Engine Plugin nochmal neu im Projekt installiert habe wollte es auch mit dem neuen App Engine SDK starten.&lt;br /&gt;&lt;a href="file:///C:/Users/stormqueen/.grails/1.1.1/projects/mariokartchallenge/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-6354846043179533779?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/6354846043179533779/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2009/09/update-der-app-engine-version-innerhalb.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/6354846043179533779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/6354846043179533779'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2009/09/update-der-app-engine-version-innerhalb.html' title='Update der App Engine Version innerhalb eines Grails Projekts'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-612072713045928606</id><published>2009-08-03T17:11:00.002+02:00</published><updated>2010-07-28T18:23:18.861+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails App Engine auf Eclipse starten</title><content type='html'>Die Vorbereitungen sind abgeschlossen:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://www.eclipse.org/"&gt;Eclipse 3.5&lt;/a&gt; ist auf dem Rechner&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://code.google.com/intl/de-DE/appengine/downloads.html"&gt;App-Engine SDK 1.2.2&lt;/a&gt; runtergeladen und entpackt&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.grails.org/"&gt;Grails 1.1.1&lt;/a&gt; entpackt und GRAILS_HOME auf das Verzeichnis gesetzt, sowie zum PATH %GRAILS_HOME%/bin hinzugefügt&lt;/li&gt;&lt;/ul&gt;Auf der &lt;a href="http://grails.org/plugin/app-engine"&gt;Grails Plugin Seite&lt;/a&gt; ist beschrieben, wie man seine erste App Engine Applikation erstellt.&lt;br /&gt;&lt;br /&gt;Dabei ergaben sich bei mir folgende Fehler:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Beim deployen der Applikation mit grails app-engine deploy hatte ich manchmal Probleme bei der Nutzername/Passwort Eingabe, ausserdem ists eh nicht schön jedes Mal die Daten wieder und wieder einzugeben.&lt;/li&gt;&lt;li&gt;Bei Versuch die App-Engine aus Eclipse heraus zu starten (debug oder run Configuration) erscheint die Fehlermeldung &lt;span&gt;&lt;span style="font-style: italic;"&gt; &lt;span style="font-weight: bold;"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;" class="highlight"&gt;grails&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt; run-&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;" class="highlight"&gt;app&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;' is not supported with &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;" class="highlight"&gt;AppEngine&lt;/span&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Einmal die App Engine gestartet, lässt sich die AppEngine nichtmehr stoppen, ausser &lt;span style="font-style: italic;"&gt;gewaltsam &lt;/span&gt;über den Taskmanager&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;Ersteres Problem lässt sich dadurch lösen, dass in der &lt;span style="font-weight: bold;"&gt;Config.groovy&lt;/span&gt; die entsprechenden Daten eingetragen werden. Über die keys google.appengine.email und google.appengine.password können die Werte festgesetzt werden.&lt;br /&gt;&lt;br /&gt;Um das zweite Problem gleich mit zu lösen hab ich &lt;span style="font-weight: bold;"&gt;diese Datei&lt;/span&gt; in mein Projektordner mit dem eigentlichen Projekt in das Verzeichnis &lt;span style="font-weight: bold;"&gt;projektname\scripts kopiert&lt;/span&gt; und in&lt;span style="font-weight: bold;"&gt; RunApp.groovy&lt;/span&gt; umbenannt. Jetzt fragt Eclipse immer welche RunApp beim Starten der Applikation verwendet werden soll und man kann die aus dem Projektverzeichnis wählen, hinter der sich eigentlich die AppEngine.groovy verbirgt.&lt;br /&gt;&lt;br /&gt;Zum Dritten hab ich noch nichts sinnvolles gefunden... auch beim Starten und vor allem Stoppen aus Eclipse raus bleibt noch ein Java-Prozess über, den man &lt;span style="font-style: italic;"&gt;abschießen &lt;/span&gt;muss. Auch scheint das &lt;span style="font-weight: bold;"&gt;Debuggen &lt;/span&gt;der Applikation &lt;span style="font-weight: bold;"&gt;mit Eclipse nicht möglich&lt;/span&gt;. Dazu soll wohl NetBeans in der Version 6.7 besser sein &lt;a href="http://www.grailsblog.com/archive/show?id=13"&gt;Link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-612072713045928606?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/612072713045928606/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2009/08/grails-app-engine-auf-eclipse-starten.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/612072713045928606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/612072713045928606'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2009/08/grails-app-engine-auf-eclipse-starten.html' title='Grails App Engine auf Eclipse starten'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-7665841785324295615</id><published>2009-08-03T16:44:00.002+02:00</published><updated>2010-07-28T18:23:37.436+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App Engine'/><title type='text'>Objekte in der Google Database suchen</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;Mit der Google App Engine erhält man Zugang zu der skalierbaren Infrastruktur von Google.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Um diese Skalierbarkeit effektiv auszunutzen, gibt es von Jason Cooper eine Reihe von Artikel über dieses Thema mit dem Titel: "Effectively scaling your App Engine-based apps"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Die orginal Artikel sind unter: &lt;/span&gt;&lt;a style="font-family: times new roman;" href="http://code.google.com/intl/de-DE/appengine/articles/scaling/overview.html"&gt;Scaling&lt;/a&gt;&lt;span style="font-family:times new roman;"&gt; zu finden.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;Hier eine Zusammenfassung der Artikel mit einigen Erläuterungen dazu.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;u&gt;Direct lookups vs. Querys&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Zusammenfassung:&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Direct lookups statt Querys benutzen sofern möglich!&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;pm.getObjectById(Klasse.class,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;span style="font-style: italic;"&gt; key&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;span style="font-style: italic;"&gt;) &lt;span style="font-weight: bold;"&gt;statt&lt;/span&gt;&lt;br /&gt;Query q = pm.newQuery(Klasse.class);&lt;br /&gt;q.setFilter("key == mykey")&lt;br /&gt;q.declareParameters("&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;span style="font-style: italic;"&gt;com.google.appengine.api.datastore.Key&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;span style="font-style: italic;"&gt; key")&lt;br /&gt;q.execute(mykey);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;Der Googe App Engine Datastore ist für Lesezugriffe optimiert. Auf der &lt;a href="http://code.google.com/status/appengine/"&gt;System Status Seite&lt;/a&gt; von Google (unter Datastore) lässt sich nachschaun, dass &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;Querys &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;im Vergleich&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt; direct lookups (get)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt; zu eine deutlich höhere (~4x) Latenz haben.&lt;br /&gt;Für die Umsetzung in Java bedeutet dies, dass die &lt;span style="font-style: italic;"&gt;getObjectById &lt;/span&gt;Methode des PersistenceManager ausgerufen wird, statt &lt;span style="font-style: italic;"&gt;newQuery&lt;/span&gt;. Dies geht natürlich nur, wenn auch die ID des Objects bekannt ist.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Fortsetzung folgt...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-7665841785324295615?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/7665841785324295615/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2009/08/objekte-in-der-google-database-suchen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/7665841785324295615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/7665841785324295615'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2009/08/objekte-in-der-google-database-suchen.html' title='Objekte in der Google Database suchen'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-414931709954865720.post-4935678518871938291</id><published>2009-08-03T10:53:00.001+02:00</published><updated>2010-07-28T18:23:47.629+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App Engine'/><title type='text'>Google App Engine</title><content type='html'>Da ich mich seit kurzem mit der Google App Engine beschäftige, habe ich beschlossen einen Blog aufzumachen, in dem ich über meine Erfahrungen damit berichte.&lt;br /&gt;&lt;br /&gt;Ich werd über Konfigurationsprobleme, Programmiertipps und sonstwas berichten, nicht zuletzt um selbst eine Art FAQ zu bekommen, in dem ich nochmal nachschlagen kann.&lt;br /&gt;&lt;br /&gt;Da ich mit Grails vertraut bin, wird mein ersten Projekt auch mit Gails 1.1.1 umgesetzt, wofür es auch schon ein entsprechendes Plugin gibt. &lt;a href="http://www.grails.org/plugin/app-engine"&gt;App-Engine Plugin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Als Entwicklungsumgebung kommt Eclipse 3.5 zum Einsatz&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/414931709954865720-4935678518871938291?l=stormqueensplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stormqueensplace.blogspot.com/feeds/4935678518871938291/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://stormqueensplace.blogspot.com/2009/08/skalierbarkeit-der-google-app-engine.html#comment-form' title='7 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/4935678518871938291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/414931709954865720/posts/default/4935678518871938291'/><link rel='alternate' type='text/html' href='http://stormqueensplace.blogspot.com/2009/08/skalierbarkeit-der-google-app-engine.html' title='Google App Engine'/><author><name>Melanie Siekmöller</name><uri>http://www.blogger.com/profile/08669628433759474621</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_ADGgAQNcq-g/SznY_fjwLZI/AAAAAAAAAC8/CdOmgvnKBtM/S220/pic.jpg'/></author><thr:total>7</thr:total></entry></feed>
