<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>NooCodeCommit</title>
	
	<link>http://www.noocodecommit.com/blog/nicogiard</link>
	<description>le petit monde de Play! framework (et de Wicket)...</description>
	<lastBuildDate>Fri, 29 Mar 2013 08:55:26 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/noocodecommit" /><feedburner:info uri="noocodecommit" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Clever-Cloud, un acteur français du cloud</title>
		<link>http://feedproxy.google.com/~r/noocodecommit/~3/tGvrvSYNmfs/clever-cloud-un-acteur-francais-du-cloud</link>
		<comments>http://www.noocodecommit.com/blog/nicogiard/play/clever-cloud-un-acteur-francais-du-cloud#comments</comments>
		<pubDate>Fri, 29 Mar 2013 08:52:42 +0000</pubDate>
		<dc:creator>nicogiard</dc:creator>
				<category><![CDATA[CleverCloud]]></category>
		<category><![CDATA[Play]]></category>

		<guid isPermaLink="false">http://www.noocodecommit.com/blog/nicogiard/?p=1187</guid>
		<description><![CDATA[Il y&#8217;a quelque temps, j&#8217;ai écris un article sur le déploiement d&#8217;une application Play Framework sur Heroku. Aujourd&#8217;hui j&#8217;aimerai vous présenter un acteur français, Clever Cloud, qui se positionne sur le même créneau, la plateforme “Cloud”, de type “PaaS” (Platform as a Service)proposant la possibilité de déployer vos applications (Play 1.2.x et Play 2, mais <a href='http://www.noocodecommit.com/blog/nicogiard/play/clever-cloud-un-acteur-francais-du-cloud' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>Il y&#8217;a quelque temps, j&#8217;ai écris un article sur le déploiement d&#8217;une application <a href="http://www.noocodecommit.com/blog/nicogiard/play/une-mise-en-production-en-moins-de-5-minutes" target="_blank">Play Framework sur Heroku</a>.</p>
<p>Aujourd&#8217;hui j&#8217;aimerai vous présenter un acteur français, <a href="http://www.clever-cloud.com/" target="_blank">Clever Cloud</a>, qui se positionne sur le même créneau, la plateforme “Cloud”, de type “PaaS” (Platform as a Service)proposant la possibilité de déployer vos applications (Play 1.2.x et Play 2, mais aussi Java + Maven, PHP, Node.js et bientôt Ruby) avec une base de données MySQL ou PostgreSQL associées.</p>
<p>Après avoir créé un compte gratuit, il vous faut configurer votre clé SSH.</p>
<p>Viens ensuite le moment de la création de votre application sur la plateforme de Clever-Cloud.</p>
<p>En vous connectant à <a href="https://console.clever-cloud.com/" target="_blank">votre espace</a>, vous devez créer une application via le menu &#8220;Add an app +&#8221; de la barre de menu.</p>
<p>Renseignez ensuite les informations de votre application :<br />
<a href="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/1.png"><img src="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/1.png?resize=695%2C375" alt="1" class="aligncenter size-large wp-image-1193" data-recalc-dims="1" /></a><br />
<br />
L&#8217;étape suivante vous propose de choisir parmis les différents environnements possible :<br />
<a href="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/2.png"><img src="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/2.png?resize=695%2C212" alt="2" class="aligncenter size-large wp-image-1194" data-recalc-dims="1" /></a><br />
<br />
Dernière étape, une vérification des informations et une validation :<br />
<a href="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/3.png"><img src="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/3.png?resize=695%2C332" alt="3" class="aligncenter size-large wp-image-1195" data-recalc-dims="1" /></a><br />
<br />
Une fois l&#8217;application créée, Clever-Cloud vous présente les informations du repository Git qu&#8217;il met à disposition :<br />
<a href="http://i1.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/4.png"><img src="http://i1.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/4.png?resize=695%2C285" alt="4" class="aligncenter size-large wp-image-1196" data-recalc-dims="1" /></a><br />
<br />
De retour sur votre machine, dans une commande shell, créez votre application Play :</p><pre class="crayon-plain-tag">C:\Dev\workspace&gt;play new playOnCleverCloud
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/
~
~ play! 1.2.5, http://www.playframework.org
~
~ The new application will be created in C:\Dev\workspace\playOnCleverCloud
~ What is the application name? [playOnCleverCloud]
~
~ OK, the application is created.
~ Start it with : play run playOnCleverCloud
~ Have fun!
~</pre><p></p>
<p>Gitifiez votre projet :</p><pre class="crayon-plain-tag">C:\Dev\workspace&gt;cd playOnCleverCloud

C:\Dev\workspace\playOnCleverCloud&gt;git init

C:\Dev\workspace\playOnCleverCloud&gt;git add .

C:\Dev\workspace\playOnCleverCloud&gt;git commit -m &quot;initial commit'</pre><p></p>
<p>Enfin ajouter un adresse remote à votre repo git local :</p><pre class="crayon-plain-tag">C:\Dev\workspace\playOnCleverCloud&gt;git remote add origin git+ssh://git@push.clever-cloud.com/app_d7eba5c4-bf02-4368-8709-36d0a2fabb25.git

C:\Dev\workspace\playOnCleverCloud&gt;git remote -v
origin  git+ssh://git@push.clever-cloud.com/app_d7eba5c4-bf02-4368-8709-36d0a2fabb25.git (fetch)
origin  git+ssh://git@push.clever-cloud.com/app_d7eba5c4-bf02-4368-8709-36d0a2fabb25.git (push)

C:\Dev\workspace\playOnCleverCloud&gt;git push origin master</pre><p></p>
<p>Un Hook Git vous affiche même un message :</p><pre class="crayon-plain-tag">...
remote: {&quot;id&quot;:320,&quot;message&quot;:&quot;The application has successfully been queued for redeploy.&quot;,&quot;type&quot;:&quot;success&quot;}
...</pre><p><br />
De retour sur la console de Clever-Cloud, vous pouvez accéder à votre application via une url mise à disposition (ou bien configurer votre propre dns)<br />
<a href="http://i1.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/5.png"><img src="http://i1.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/5.png?resize=695%2C297" alt="5" class="aligncenter size-large wp-image-1197" data-recalc-dims="1" /></a><br />
<br />
Enfin CleverCloud vous propose une interface pour voir les logs :<br />
<a href="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/6.png"><img src="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/6.png?resize=695%2C320" alt="6" class="aligncenter size-large wp-image-1198" data-recalc-dims="1" /></a><br />
<br />
Vous pouvez aussi choisir un service de Base de données (MySQL ou PostgreSQL) :<br />
<a href="http://i1.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/7.png"><img src="http://i1.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/7.png?resize=695%2C344" alt="7" class="aligncenter size-large wp-image-1199" data-recalc-dims="1" /></a><br />
<br />
Maintenant vous devez démarrer votre application<br />
<a href="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/8.png"><img src="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/8.png?resize=695%2C372" alt="8" class="aligncenter size-large wp-image-1216" data-recalc-dims="1" /></a><br />
<br />
<a href="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/9.png"><img src="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2013/03/9.png?resize=695%2C371" alt="9" class="aligncenter size-large wp-image-1217" data-recalc-dims="1" /></a></p>
<p>Et voilà votre application est déployée et en fonctionnement. Vous pouvez vous rendre à l&#8217;adresse que clever-cloud met à votre disposition (dans le panel &#8220;Domain Names&#8221;)</p>
<p>Bravo à Clever-Cloud pour leur interface simple et pratique d&#8217;emploi (et leur réactivité en cas de question)</p>
<hr />
<p><small>© nicogiard pour <a href="http://www.noocodecommit.com/blog/nicogiard">NooCodeCommit</a>, 2013. |
<a href="http://www.noocodecommit.com/blog/nicogiard/play/clever-cloud-un-acteur-francais-du-cloud">Permalink</a> |
<a href="http://www.noocodecommit.com/blog/nicogiard/play/clever-cloud-un-acteur-francais-du-cloud#comments">Pas de commentaire</a> 
<br/>
Tags: <a href="http://www.noocodecommit.com/blog/nicogiard/tag/clevercloud" rel="tag">CleverCloud</a>, <a href="http://www.noocodecommit.com/blog/nicogiard/tag/play" rel="tag">Play</a><br/>
</small></p><img src="http://feeds.feedburner.com/~r/noocodecommit/~4/tGvrvSYNmfs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.noocodecommit.com/blog/nicogiard/play/clever-cloud-un-acteur-francais-du-cloud/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.noocodecommit.com/blog/nicogiard/play/clever-cloud-un-acteur-francais-du-cloud</feedburner:origLink></item>
		<item>
		<title>Erreur de Transaction SQL lors d’un test Fonctionnel avec Play!&gt;</title>
		<link>http://feedproxy.google.com/~r/noocodecommit/~3/gMVQ4yMtUv4/erreur-de-transaction-sql-lors-dun-test-fonctionnel-avec-play</link>
		<comments>http://www.noocodecommit.com/blog/nicogiard/play/erreur-de-transaction-sql-lors-dun-test-fonctionnel-avec-play#comments</comments>
		<pubDate>Fri, 28 Sep 2012 12:58:21 +0000</pubDate>
		<dc:creator>nicogiard</dc:creator>
				<category><![CDATA[Play]]></category>

		<guid isPermaLink="false">http://www.noocodecommit.com/blog/nicogiard/?p=1143</guid>
		<description><![CDATA[Je viens d&#8217;être confronté à un problème lors de l&#8217;exécution des tests Fonctionnels d&#8217;une application Play!> avec la base de données MySQL (alors qu&#8217;avec H2 le problème n’apparaît pas). Sur un projet Play!> 1.2.5 avec MySQL (InnoDB), j&#8217;ai souhaité réaliser un test fonctionnel, pourtant très simple (un model User, un controller et une classe de <a href='http://www.noocodecommit.com/blog/nicogiard/play/erreur-de-transaction-sql-lors-dun-test-fonctionnel-avec-play' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>Je viens d&#8217;être confronté à un problème lors de l&#8217;exécution des tests Fonctionnels d&#8217;une application Play!> avec la base de données MySQL (alors qu&#8217;avec H2 le problème n’apparaît pas).</p>
<p>Sur un projet Play!> 1.2.5 avec MySQL (InnoDB), j&#8217;ai souhaité réaliser un test fonctionnel, pourtant très simple (un model User, un controller et une classe de test du controller), et pourtant j&#8217;ai été confronté à l&#8217;erreur suivante :</p><pre class="crayon-plain-tag">A java.lang.RuntimeException has been caught, java.util.concurrent.ExecutionException: 
play.exceptions.JavaExecutionException: 
Try to read id on null object models.User (controllers.Application.index, line 11)</pre><p></p>
<p>Visiblement, lors de l’exécution du tests fonctionnel, la couche Controller ne semblait pas trouver de résultat, alors que la couche de test en trouvait&#8230;</p>
<p>Je vais essayer de vous montrer ici mon analyse du problème et une solution pour le contourner.</p>
<p>Pour les plus flemmard, voici <a href='http://www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/09/fixtureFail.zip'>un zip du projet</a>.</p>
<p>Avant toute chose, créons une base de données (et un utilisateur) sous MySQL :</p><pre class="crayon-plain-tag">$ mysql -u root -p
Enter password: 

mysql&gt; CREATE DATABASE fixtureFail;
Query OK, 1 row affected (0.01 sec)

mysql&gt; CREATE USER 'fixtureFail'@'%' IDENTIFIED BY 'fixtureFail';
Query OK, 0 rows affected (0.00 sec)

mysql&gt; GRANT ALL ON fixtureFail.* TO 'fixtureFail'@'%' IDENTIFIED BY 'fixtureFail';
Query OK, 0 rows affected (0.07 sec)</pre><p></p>
<p>Puis créons une application Play!> standard:</p><pre class="crayon-plain-tag">$ play new fixtureFail</pre><p></p>
<p>Modifions quelque peut le fichier de configuration :<br />
application.conf</p><pre class="crayon-plain-tag"># Dev
# ~~~~~
application.name=fixtureFail
application.mode=dev
application.secret=NarifLkF6ynvKppI0Rw36mxKpiEP9ThPeHKFPQ79tH9CPukWMuIVZZByHfHFcmIO
application.log=DEBUG
date.format=yyyy-MM-dd
attachments.path=data/attachments
db=mem
mail.smtp=mock

# Testing
# ~~~~~
%test.application.mode=dev
%test.jpa.ddl=update
%test.mail.smtp=mock
#%test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0
%test.db.url=jdbc:mysql://localhost/fixtureFail
%test.db.driver=com.mysql.jdbc.Driver
%test.db.user=fixtureFail
%test.db.pass=fixtureFail</pre><p></p>
<p>Et codons ensuite les 3 classes qui nous interessent :</p>
<p>app.models.User</p><pre class="crayon-plain-tag">package models;

import play.db.jpa.Model;
import javax.persistence.Entity;

@Entity
public class User extends Model {
    public String username;
    public String email;
}</pre><p></p>
<p>app.controllers.Application</p><pre class="crayon-plain-tag">package controllers;

import models.User;
import play.Logger;
import play.mvc.Controller;

public class Application extends Controller {
    public static void index() {
        User user = User.find(&quot;username=?&quot;, &quot;nicogiard&quot;).first();
        Logger.debug(&quot;user from controller : %s&quot;, user.id);
        render();
    }
}</pre><p></p>
<p>test.ApplicationTest</p><pre class="crayon-plain-tag">import models.User;
import org.junit.BeforeClass;
import org.junit.Test;
import play.Logger;
import play.mvc.Http.Response;
import play.test.Fixtures;
import play.test.FunctionalTest;

public class ApplicationTest extends FunctionalTest {

    @BeforeClass
    public static void before() {
        Logger.debug(&quot;~~~~~~~~~~~~~~~~~~~~~~~~&quot;);
        Fixtures.deleteAllModels();
        Fixtures.loadModels(&quot;initial-data.yml&quot;);

        User user = User.find(&quot;username=?&quot;, &quot;nicogiard&quot;).first();
        Logger.debug(&quot;user from before : %s&quot;, user.id);
    }

    @Test
    public void testThatIndexPageWorks() {
        User user = User.find(&quot;username=?&quot;, &quot;nicogiard&quot;).first();
        Logger.debug(&quot;user from test : %s&quot;, user.id);

        Response response = GET(&quot;/&quot;);
        assertIsOk(response);
        assertContentType(&quot;text/html&quot;, response);
        assertCharset(&quot;utf-8&quot;, response);
    }
}</pre><p></p>
<p>Lançons ensuite les tests. Nous nous attendons à avoir un résultat (dans la console) proche de celui ci :</p><pre class="crayon-plain-tag">user from before : 1
user from test : 1
user from controller : 1</pre><p></p>
<p>Mais pour une raison que je n&#8217;explique pas trop voilà le résultat obtenu :</p><pre class="crayon-plain-tag">$ play test
...
11:21:21,922 INFO  ~ Application 'fixtureFail' is now started !
11:21:29,287 DEBUG ~ ~~~~~~~~~~~~~~~~~~~~~~~~
11:21:29,791 DEBUG ~ user from before : 1
11:21:29,805 DEBUG ~ user from test : 1</pre><p></p>
<p>Et le Test échoue lamentablement&#8230;<br />
<a href="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/09/Play-Tests-runner-Fail.png"><img src="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/09/Play-Tests-runner-Fail.png?resize=695%2C346" alt="" title="Play! - Tests runner - Fail" class="aligncenter size-large wp-image-1146" data-recalc-dims="1" /></a></p>
<p>Alors qu&#8217;en base de données la donnée existe bien.</p><pre class="crayon-plain-tag">mysql&gt; select * from User;
+----+---------------------+-----------+
| id | email               | username  |
+----+---------------------+-----------+
|  1 | nicogiard@gmail.com | nicogiard |
+----+---------------------+-----------+
1 row in set (0.00 sec)</pre><p></p>
<p>Le problème semble être que deux transactions indépendantes sont en cours (une pour le test et une pour le controller) ou quelque chose du genre.</p>
<p>Je vous avoue que je n&#8217;ai pas encore eu beaucoup de temps pour fouiller dans le code source de Play!> pour chercher d&#8217;où cela peut venir, mais j&#8217;ai au moins une solution pour pallier au problème</p>
<p>Vous devez donc modifier le mode de chargement des données initiales dans votre test fonctionnel avec le code suivant :<br />
test.ApplicationTest</p><pre class="crayon-plain-tag">...
    @BeforeClass
    public static void before() throws ExecutionException, InterruptedException {
        Logger.debug(&quot;~~~~~~~~~~~~~~~~~~~~~~~~&quot;);
        new Job() {
            @Override
            public void doJob() {
                Fixtures.deleteAllModels();
                Fixtures.loadModels(&quot;initial-data.yml&quot;);
            }

        }.now().get();

        User user = User.find(&quot;username=?&quot;, &quot;nicogiard&quot;).first();
        Logger.debug(&quot;user from before : %s&quot;, user.id);
    }
...</pre><p></p>
<p>En effet, le chargement au sein d&#8217;un Job semble contourner le problème et permettre d&#8217;exécuter le test et d&#8217;obtenir le résultat escompté.</p>
<p></p><pre class="crayon-plain-tag">$ play test
11:26:20,386 INFO  ~ Application 'fixtureFail' is now started !
11:26:26,574 DEBUG ~ ~~~~~~~~~~~~~~~~~~~~~~~~
11:26:27,120 DEBUG ~ user from before : 1
11:26:27,126 DEBUG ~ user from test : 1
11:26:27,141 DEBUG ~ user from controller : 1</pre><p></p>
<p>Et maintenant le test passe<br />
<a href="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/09/Play-Tests-runner-Win.png"><img src="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/09/Play-Tests-runner-Win.png?resize=695%2C346" alt="" title="Play! - Tests runner - Win" class="aligncenter size-large wp-image-1147" data-recalc-dims="1" /></a></p>
<p>Si jamais l&#8217;un d&#8217;entre vous avait ne serait-ce qu&#8217;une idée, n&#8217;hésitez pas à partager avec nous !</p>
<hr />
<p><small>© nicogiard pour <a href="http://www.noocodecommit.com/blog/nicogiard">NooCodeCommit</a>, 2012. |
<a href="http://www.noocodecommit.com/blog/nicogiard/play/erreur-de-transaction-sql-lors-dun-test-fonctionnel-avec-play">Permalink</a> |
<a href="http://www.noocodecommit.com/blog/nicogiard/play/erreur-de-transaction-sql-lors-dun-test-fonctionnel-avec-play#comments">Pas de commentaire</a> 
<br/>
Tags: <a href="http://www.noocodecommit.com/blog/nicogiard/tag/play" rel="tag">Play</a><br/>
</small></p><img src="http://feeds.feedburner.com/~r/noocodecommit/~4/gMVQ4yMtUv4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.noocodecommit.com/blog/nicogiard/play/erreur-de-transaction-sql-lors-dun-test-fonctionnel-avec-play/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.noocodecommit.com/blog/nicogiard/play/erreur-de-transaction-sql-lors-dun-test-fonctionnel-avec-play</feedburner:origLink></item>
		<item>
		<title>Votre application Play!&gt; au démarrage de votre serveur Ubuntu</title>
		<link>http://feedproxy.google.com/~r/noocodecommit/~3/YsKuiHnTDzw/votre-application-play-au-demarrage-de-votre-serveur-ubuntu</link>
		<comments>http://www.noocodecommit.com/blog/nicogiard/play/votre-application-play-au-demarrage-de-votre-serveur-ubuntu#comments</comments>
		<pubDate>Fri, 14 Sep 2012 08:43:16 +0000</pubDate>
		<dc:creator>nicogiard</dc:creator>
				<category><![CDATA[Play]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.noocodecommit.com/blog/nicogiard/?p=1133</guid>
		<description><![CDATA[Je vous présente aujoud&#8217;hui un petit script bash que j&#8217;utilise pour lancer mes applications Play!> au démarrage de mon serveur Ubuntu. En effet, quoi de plus pénible qu&#8217;une application Play!> qui ne se relance pas en cas de restart d&#8217;un serveur. Voilà donc le script shell que j&#8217;utilise sur mon serveur Ubuntu : ex : <a href='http://www.noocodecommit.com/blog/nicogiard/play/votre-application-play-au-demarrage-de-votre-serveur-ubuntu' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>Je vous présente aujoud&#8217;hui un petit script bash que j&#8217;utilise pour lancer mes applications Play!> au démarrage de mon serveur Ubuntu.</p>
<p>En effet, quoi de plus pénible qu&#8217;une application Play!> qui ne se relance pas en cas de restart d&#8217;un serveur.</p>
<p>Voilà donc le script shell que j&#8217;utilise sur mon serveur Ubuntu :<br />
ex : /etc/init.d/play-monapplication</p><pre class="crayon-plain-tag">#!/bin/sh

# Path to play install folder
PLAY_HOME=/opt/play/play-1.2.5
PLAY=$PLAY_HOME/play

# User running the Play process
USER=playUser

# Path to the application
APPLICATION_PATH=/opt/monapplication

case &quot;$1&quot; in
    start)
        echo -n &quot;Starting Play service: &quot;
        rm -f ${APPLICATION_PATH}/server.pid
        su $USER -c &quot;${PLAY} start ${APPLICATION_PATH} --%prod &gt;/dev/null&quot;
        RETVAL=$?

        if [ $RETVAL -eq 0 ]; then
            echo -n &quot;Done\n&quot;
        else
            echo -n &quot;Something goes wrong...\n&quot;
        fi
        ;;
    stop)
        echo -n &quot;Shutting down Play service: &quot;
        ${PLAY} stop ${APPLICATION_PATH} &gt; /dev/null

        RETVAL=$?

        if [ $RETVAL -eq 0 ]; then
            echo -n &quot;Done\n&quot;
        else
            echo -n &quot;Something goes wrong...\n&quot;
        fi
        ;;
    status)
        ${PLAY} status ${APPLICATION_PATH}
        RETVAL=$?
        ;;
    *)
        echo &quot;Usage: $SCRIPTNAME {start|stop|status}&quot; &gt;&amp;2
        exit 1
        ;;
esac
exit 0</pre><p></p>
<p>Ne pas oublier de rendre exécutable votre script :<br />
<code><br />
sudo chmod +x /etc/init.d/play-monapplication<br />
</code></p>
<p>Ensuite on ajoute ce script au services de la machine<br />
<code><br />
sudo update-rc.d play-monapplication defaults<br />
</code></p>
<p>ps : pour mémoire, pour supprimer un script des services<br />
<code><br />
sudo update-rc.d -f play-monapplication remove<br />
</code></p>
<hr />
<p><small>© nicogiard pour <a href="http://www.noocodecommit.com/blog/nicogiard">NooCodeCommit</a>, 2012. |
<a href="http://www.noocodecommit.com/blog/nicogiard/play/votre-application-play-au-demarrage-de-votre-serveur-ubuntu">Permalink</a> |
<a href="http://www.noocodecommit.com/blog/nicogiard/play/votre-application-play-au-demarrage-de-votre-serveur-ubuntu#comments">Pas de commentaire</a> 
<br/>
Tags: <a href="http://www.noocodecommit.com/blog/nicogiard/tag/play" rel="tag">Play</a>, <a href="http://www.noocodecommit.com/blog/nicogiard/tag/ubuntu" rel="tag">Ubuntu</a><br/>
</small></p><img src="http://feeds.feedburner.com/~r/noocodecommit/~4/YsKuiHnTDzw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.noocodecommit.com/blog/nicogiard/play/votre-application-play-au-demarrage-de-votre-serveur-ubuntu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.noocodecommit.com/blog/nicogiard/play/votre-application-play-au-demarrage-de-votre-serveur-ubuntu</feedburner:origLink></item>
		<item>
		<title>Masquer l’icône “Préférences d’accès universel” du System Tray sous Ubuntu 12.04</title>
		<link>http://feedproxy.google.com/~r/noocodecommit/~3/5iu60AslPXs/masquer-licone-preferences-dacces-universel-du-system-tray-sous-ubuntu-12-04</link>
		<comments>http://www.noocodecommit.com/blog/nicogiard/tips/masquer-licone-preferences-dacces-universel-du-system-tray-sous-ubuntu-12-04#comments</comments>
		<pubDate>Mon, 23 Jul 2012 09:30:57 +0000</pubDate>
		<dc:creator>nicogiard</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.noocodecommit.com/blog/nicogiard/?p=1113</guid>
		<description><![CDATA[Après une installation fraiche d&#8217;Ubuntu 12.04, je me retrouve avec cet icone dans le system tray : Après avoir pas mal cherché comment enlever cet icône (pas de clic droit / supprimer &#8230;) j&#8217;ai enfin trouvé comment faire! Voici la marche à suivre : Menu Système / &#8220;Paramètres Système&#8221; Cliquer sur le menu &#8220;Accès universel&#8221; <a href='http://www.noocodecommit.com/blog/nicogiard/tips/masquer-licone-preferences-dacces-universel-du-system-tray-sous-ubuntu-12-04' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>Après une installation fraiche d&#8217;Ubuntu 12.04, je me retrouve avec cet icone dans le system tray :</p>
<p><a href="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/07/icon.png"><img src="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/07/icon.png?resize=22%2C24" alt="" title="icon" class="aligncenter size-full wp-image-1117" data-recalc-dims="1" /></a></p>
<p>Après avoir pas mal cherché comment enlever cet icône (pas de clic droit / supprimer &#8230;) j&#8217;ai enfin trouvé comment faire! Voici la marche à suivre :<br />
Menu Système / &#8220;Paramètres Système&#8221;<br />
<a href="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/07/menu-system.png"><img src="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/07/menu-system.png?resize=523%2C299" alt="" title="menu-system" class="aligncenter size-full wp-image-1118" data-recalc-dims="1" /></a></p>
<p>Cliquer sur le menu &#8220;Accès universel&#8221;<br />
<a href="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/07/system-panel.png"><img src="http://i2.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/07/system-panel.png?resize=695%2C616" alt="" title="system-panel" class="aligncenter size-full wp-image-1120" data-recalc-dims="1" /></a></p>
<p>Dans l&#8217;onglet &#8220;Saisie&#8221;, décocher l&#8217;option &#8220;Activer les fonctionnalités d&#8217;accéssibilité à partir du clavier&#8221;<br />
<a href="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/07/option-keyboard-accessibility.png"><img src="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2012/07/option-keyboard-accessibility.png?resize=695%2C474" alt="" title="option-keyboard-accessibility" class="aligncenter size-full wp-image-1119" data-recalc-dims="1" /></a></p>
<p>Et voilà l&#8217;icône a disparu.</p>
<hr />
<p><small>© nicogiard pour <a href="http://www.noocodecommit.com/blog/nicogiard">NooCodeCommit</a>, 2012. |
<a href="http://www.noocodecommit.com/blog/nicogiard/tips/masquer-licone-preferences-dacces-universel-du-system-tray-sous-ubuntu-12-04">Permalink</a> |
<a href="http://www.noocodecommit.com/blog/nicogiard/tips/masquer-licone-preferences-dacces-universel-du-system-tray-sous-ubuntu-12-04#comments">Pas de commentaire</a> 
<br/>
Tags: <a href="http://www.noocodecommit.com/blog/nicogiard/tag/tips" rel="tag">Tips</a>, <a href="http://www.noocodecommit.com/blog/nicogiard/tag/ubuntu" rel="tag">Ubuntu</a><br/>
</small></p><img src="http://feeds.feedburner.com/~r/noocodecommit/~4/5iu60AslPXs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.noocodecommit.com/blog/nicogiard/tips/masquer-licone-preferences-dacces-universel-du-system-tray-sous-ubuntu-12-04/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.noocodecommit.com/blog/nicogiard/tips/masquer-licone-preferences-dacces-universel-du-system-tray-sous-ubuntu-12-04</feedburner:origLink></item>
		<item>
		<title>Une mise en production en moins de 5 minutes….</title>
		<link>http://feedproxy.google.com/~r/noocodecommit/~3/HraGJOrxqRY/une-mise-en-production-en-moins-de-5-minutes</link>
		<comments>http://www.noocodecommit.com/blog/nicogiard/play/une-mise-en-production-en-moins-de-5-minutes#comments</comments>
		<pubDate>Mon, 25 Jun 2012 14:47:04 +0000</pubDate>
		<dc:creator>nicogiard</dc:creator>
				<category><![CDATA[Heroku]]></category>
		<category><![CDATA[Play]]></category>

		<guid isPermaLink="false">http://www.noocodecommit.com/blog/nicogiard/?p=1103</guid>
		<description><![CDATA[Je ne sais pas vous, mais dans ma carrière, j&#8217;ai eu à mettre en production de nombreuses applications web. Actions qui pouvaient prendre beaucoup de temps en fonction du nombre d&#8217;intermédiaire ou de la procédure &#8220;sécurisé&#8221; de mise en production. Et bien quand j&#8217;ai eu l&#8217;occasion d&#8217;essayer la plateforme Heroku, j&#8217;ai tout simplement halluciné ! <a href='http://www.noocodecommit.com/blog/nicogiard/play/une-mise-en-production-en-moins-de-5-minutes' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>Je ne sais pas vous, mais dans ma carrière, j&#8217;ai eu à mettre en production de nombreuses applications web. Actions qui pouvaient prendre beaucoup de temps en fonction du nombre d&#8217;intermédiaire ou de la procédure &#8220;sécurisé&#8221; de mise en production.</p>
<p>Et bien quand j&#8217;ai eu l&#8217;occasion d&#8217;essayer la plateforme <a href="http://www.heroku.com/">Heroku</a>, j&#8217;ai tout simplement halluciné !</p>
<p><a href="http://www.heroku.com/">Heroku</a> est une plateforme dite &#8220;Cloud&#8221;, de type &#8220;PaaS&#8221; (Platform as a Service). Elle vous offre la possibilité de déployer vos applications (Java Servlet, Rails, Node.js mais aussi <a href="http://www.playframework.org/">Play! Framework</a>) avec une base de données <a href="http://www.postgresql.org/">PostgreSQL</a> associées.</p>
<p>J&#8217;ai donc voulu voir si c&#8217;était vraiment utilisable. Après avoir ouvert un compte <strong>Gratuit</strong> chez Heroku, j&#8217;ai paramétré mes clés SSH comme il le fallait, j&#8217;ai ensuite essayer de livrer en production une application Play! Framework from scratch.</p>
<p>ps : n&#8217;est pas comptabilisé dans le temps, l&#8217;installation de Java et de Play! Framework, considérant que cela fait partie de mon environnement de travail.</p>
<p>Le mode opératoire est le suivant :</p>
<ul>
<li>Installation du <a href="https://toolbelt.heroku.com/">Heroku Toolbelt</a></li>
<li>Création d&#8217;un nouveau projet avec Play! Framework</li>
<li>Connexion à Heroku</li>
<li>Création de l&#8217;instance sur la plateforme heroku</li>
<li>Git init -> add . -> commit</li>
<li>Git push sur le repository mis à disposition par héroku</li>
<li>Ouverture du navigateur</li>
</ul>
<h3>Résultat:</h3>
<p><strong>Début</strong> : 16:13:35<br />
<strong>Fin</strong> : 16:18:20<br />
Soit <strong>04 Minutes 45 Secondes</strong></p>
<p><strong>En moins de 5 minutes vous avez une application Play Framework Up and Ready, accessible sur le Net, avec une base de données&#8230;</strong></p>
<hr/>
<p>Voilà la trace de mon expérimentation pour les curieux<br />
<code><br />
nicogiard@bespin:~/workspace$ date<br />
lundi 25 juin 2012, 16:13:35 (UTC+0200)</p>
<p>nicogiard@bespin:~/workspace$ wget -qO- https://toolbelt.heroku.com/install.sh | sh<br />
...</p>
<p>nicogiard@bespin:~/workspace$ play new playOnHeroku<br />
~        _            _<br />
~  _ __ | | __ _ _  _| |<br />
~ | '_ \| |/ _' | || |_|<br />
~ |  __/|_|\____|\__ (_)<br />
~ |_|            |__/<br />
~<br />
~ play! 1.2.4, http://www.playframework.org<br />
~<br />
~ The new application will be created in /home/nicogiard/workspace/playOnHeroku<br />
~ What is the application name? [playOnHeroku]<br />
~<br />
~ OK, the application is created.<br />
~ Start it with : play run playOnHeroku<br />
~ Have fun!<br />
~<br />
nicogiard@bespin:~/workspace$ cd playOnHeroku</p>
<p>nicogiard@bespin:~/workspace/playOnHeroku$ cp ../Procfile ./</p>
<p>nicogiard@bespin:~/workspace/playOnHeroku$ heroku login<br />
Enter your Heroku credentials.<br />
Email: monCompte@heroku<br />
Password (typing will be hidden):<br />
Authentication successful.</p>
<p>nicogiard@bespin:~/workspace/playOnHeroku$ heroku create --stack cedar<br />
Creating falling-night-3220... done, stack is cedar<br />
http://falling-night-3220.herokuapp.com/ | git@heroku.com:falling-night-3220.git<br />
 !    New default stack: Cedar. To use Bamboo, run `heroku create -s bamboo`.</p>
<p>nicogiard@bespin:~/workspace/playOnHeroku$ git init<br />
Initialized empty Git repository in /home/nicogiard/workspace/playOnHeroku/.git/</p>
<p>nicogiard@bespin:~/workspace/playOnHeroku$ git add .</p>
<p>nicogiard@bespin:~/workspace/playOnHeroku$ git commit -m "Initial Commit"<br />
[master (root-commit) 502a8e7] Initial Commit<br />
 16 files changed, 364 insertions(+)<br />
 create mode 100644 Procfile<br />
 create mode 100644 app/controllers/Application.java<br />
 create mode 100644 app/views/Application/index.html<br />
 create mode 100644 app/views/errors/404.html<br />
 create mode 100644 app/views/errors/500.html<br />
 create mode 100644 app/views/main.html<br />
 create mode 100644 conf/application.conf<br />
 create mode 100644 conf/dependencies.yml<br />
 create mode 100644 conf/messages<br />
 create mode 100644 conf/routes<br />
 create mode 100644 public/images/favicon.png<br />
 create mode 100644 public/javascripts/jquery-1.6.4.min.js<br />
 create mode 100644 public/stylesheets/main.css<br />
 create mode 100644 test/Application.test.html<br />
 create mode 100644 test/ApplicationTest.java<br />
 create mode 100644 test/BasicTest.java<br />
 create mode 100644 test/data.yml</p>
<p>nicogiard@bespin:~/workspace/playOnHeroku$ git remote add heroku git@heroku.com:falling-night-3220.git</p>
<p>nicogiard@bespin:~/workspace/playOnHeroku$ git push heroku master<br />
Counting objects: 30, done.<br />
Compressing objects: 100% (22/22), done.<br />
Writing objects: 100% (30/30), 38.06 KiB, done.<br />
Total 30 (delta 1), reused 0 (delta 0)</p>
<p>-----> Heroku receiving push<br />
-----> Play! app detected<br />
-----> WARNING: Play! version not specified in dependencies.yml. Default version: 1.2.4 being used....<br />
-----> Installing Play! 1.2.4.....<br />
-----> done<br />
-----> Installing ivysettings.xml..... done<br />
-----> Building Play! application...<br />
       ~        _            _<br />
       ~  _ __ | | __ _ _  _| |<br />
       ~ | '_ \| |/ _' | || |_|<br />
       ~ |  __/|_|\____|\__ (_)<br />
       ~ |_|            |__/<br />
       ~<br />
       ~ play! 1.2.4, http://www.playframework.org<br />
       ~<br />
       1.2.4<br />
       Building Play! application at directory ./<br />
       Resolving dependencies: .play/play dependencies ./ --forProd --forceCopy --silent -Duser.home=/tmp/build_2eici4qw4ugfc 2>&#038;1<br />
       :: loading settings :: file = /tmp/build_2eici4qw4ugfc/.ivy2/ivysettings.xml<br />
       ~ Resolving dependencies using /tmp/build_2eici4qw4ugfc/conf/dependencies.yml,<br />
       ~<br />
       ~<br />
       ~ No dependencies to install<br />
       ~<br />
       ~ Done!<br />
       ~<br />
       Precompiling: .play/play precompile ./ --silent 2>&#038;1<br />
       Listening for transport dt_socket at address: 8000<br />
       14:15:13,659 INFO  ~ Starting /tmp/build_2eici4qw4ugfc<br />
       14:15:14,293 INFO  ~ Precompiling ...<br />
       14:15:19,587 INFO  ~ Done.<br />
-----> Discovering process types<br />
       Procfile declares types -> web<br />
-----> Compiled slug size is 26.5MB<br />
-----> Launching... done, v4<br />
       http://falling-night-3220.herokuapp.com deployed to Heroku</p>
<p>To git@heroku.com:falling-night-3220.git<br />
 * [new branch]      master -> master<br />
nicogiard@bespin:~/workspace/playOnHeroku$ heroku open<br />
Opening http://falling-night-3220.herokuapp.com/</p>
<p>nicogiard@bespin:~/workspace/playOnHeroku$ date<br />
lundi 25 juin 2012, 16:18:20 (UTC+0200)<br />
</code></p>
<hr />
<p><small>© nicogiard pour <a href="http://www.noocodecommit.com/blog/nicogiard">NooCodeCommit</a>, 2012. |
<a href="http://www.noocodecommit.com/blog/nicogiard/play/une-mise-en-production-en-moins-de-5-minutes">Permalink</a> |
<a href="http://www.noocodecommit.com/blog/nicogiard/play/une-mise-en-production-en-moins-de-5-minutes#comments">2 commentaires</a> 
<br/>
Tags: <a href="http://www.noocodecommit.com/blog/nicogiard/tag/heroku" rel="tag">Heroku</a>, <a href="http://www.noocodecommit.com/blog/nicogiard/tag/play" rel="tag">Play</a><br/>
</small></p><img src="http://feeds.feedburner.com/~r/noocodecommit/~4/HraGJOrxqRY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.noocodecommit.com/blog/nicogiard/play/une-mise-en-production-en-moins-de-5-minutes/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.noocodecommit.com/blog/nicogiard/play/une-mise-en-production-en-moins-de-5-minutes</feedburner:origLink></item>
		<item>
		<title>Play! Framework Tips : Circular reference avec renderJSON</title>
		<link>http://feedproxy.google.com/~r/noocodecommit/~3/j5lPXb80wOQ/play-framework-tips-circular-reference-avec-renderjson</link>
		<comments>http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-circular-reference-avec-renderjson#comments</comments>
		<pubDate>Tue, 06 Sep 2011 07:11:35 +0000</pubDate>
		<dc:creator>nicogiard</dc:creator>
				<category><![CDATA[Play]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.noocodecommit.com/blog/nicogiard/?p=1070</guid>
		<description><![CDATA[Imaginez le Diagramme UML suivant : Qui pourrait parfaitement représenter les Objets d&#8217;un Blog, mais pas que. Imaginez que vous souhaitiez réaliser un API, compatible REST, qui vous permette de récupérer vos Posts et Comments au format JSon. Nos Objets Métiers Commençons tout d&#8217;abord par écrire nos objets Model : app/models/Post.java[crayon-51556038e1fa0/] app/models/Comment.java[crayon-51556038e1ff7/] Données de référence <a href='http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-circular-reference-avec-renderjson' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>Imaginez le Diagramme UML suivant :<br />
<img alt="" src="http://yuml.me/diagram/scruffy/class/[Post]+1-*%3E[Comment]" title="[Post]+1-*&gt;[Comment]" class="aligncenter" width="336" height="69" /></p>
<p>Qui pourrait parfaitement représenter les Objets d&#8217;un Blog, mais pas que.</p>
<p>Imaginez que vous souhaitiez réaliser un API, compatible REST, qui vous permette de récupérer vos <code>Posts</code> et <code>Comments</code> au format <a href="http://fr.wikipedia.org/wiki/JavaScript_Object_Notation">JSon</a>.</p>
<h2>Nos Objets Métiers</h2>
<p>Commençons tout d&#8217;abord par écrire nos objets <code>Model</code> :<br />
<code>app/models/Post.java</code></p><pre class="crayon-plain-tag">package models;

import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import play.data.validation.Required;
import play.db.jpa.Model;

@Entity
public class Post extends Model {
    @Required
    public String author;

    @Required
    public String title;

    @OneToMany(mappedBy = &quot;post&quot;, cascade = CascadeType.ALL)
    public List&lt;Comment&gt; comments;
}</pre><p></p>
<p><code>app/models/Comment.java</code></p><pre class="crayon-plain-tag">package models;

import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import play.data.validation.MaxSize;
import play.data.validation.Required;
import play.db.jpa.Model;

@Entity
public class Comment extends Model {
    @Required
    public String author;

    @Lob
    @Required
    @MaxSize(10000)
    public String content;

    @ManyToOne
    @Required
    public Post post;
}</pre><p></p>
<h2>Données de référence &#038; Configuration</h2>
<p>Pour nous simplifier la vie, Play! prévoit un mécanisme très pratique d&#8217;import de données, basé sur l&#8217;utilisation d&#8217;un fichier au format <a href="http://fr.wikipedia.org/wiki/YAML">YAML</a><br />
<code>conf/initial-data.yml</code></p><pre class="crayon-plain-tag">Post(post1):
  author: moi
  title: Post 1
  
Post(post2):
  author: moi
  title: Post 2

Comment(c1):
  author: moi
  content: du Contenu
  post: post1

Comment(c2):
  author: moi
  content: du Contenu
  post: post1

Comment(c3):
  author: moi
  content: du Contenu
  post: post2</pre><p></p>
<p><code>conf/application.conf</code></p><pre class="crayon-plain-tag">...
db=mem
...</pre><p></p>
<h2>Bootstrap Job &#038; Controller</h2>
<p>Le <code>Bootstrap Job</code> va nous permettre d&#8217;importer nos données de référence sans effort, et notre contrôleur devra réaliser notre besoin initial, à savoir nous retourner la liste des <code>Posts</code><br />
<code>app/controllers/Bootstrap.java</code></p><pre class="crayon-plain-tag">package controllers;

import models.Post;
import play.jobs.Job;
import play.jobs.OnApplicationStart;
import play.test.Fixtures;

@OnApplicationStart
public class Bootstrap extends Job {
    public void doJob() {
        if (Post.count() == 0) {
            Fixtures.loadModels(&quot;initial-data.yml&quot;);
        }
    }
}</pre><p></p>
<p><code>app/controllers/Application.java</code></p><pre class="crayon-plain-tag">package controllers;

import java.util.List;
import models.Post;
import play.mvc.Controller;

public class Application extends Controller {
    public static void index() {
        List&lt;Post&gt; posts = Post.findAll();
        renderJSON(posts);
    }
}</pre><p></p>
<h2>Premier résultat</h2>
<p>Après avoir accédé via votre navigateur à l&#8217;adresse <a href="http://localhost:9000">http://localhost:9000</a>, vous devriez avoir l&#8217;erreur suivante&nbsp;:<br />
<a href="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2011/09/error-json.png"><img src="http://i0.wp.com/www.noocodecommit.com/blog/nicogiard/wp-content/uploads/2011/09/error-json.png?resize=695%2C238" alt="" title="error-json" class="aligncenter size-large wp-image-1074" data-recalc-dims="1" /></a></p>
<p>Et dans votre console :</p><pre class="crayon-plain-tag">@67jf5njpa
Internal Server Error (500) for request GET /

Execution exception (In /app/controllers/Application.java around line 12)
IllegalStateException occured : circular reference error   Offending field: post    Offending object: preserveType: false, type: class models.Post, obj: Post[1]</pre><p></p>
<h2>Corrections</h2>
<p>La méthode <code>renderJSON</code> prévoit l&#8217;utilisation de vos propre <code>JSonSerializer</code>. Ce que nous allons faire pour nos Objets <code>Post</code> et <code>Comment</code>.</p>
<p><code>app/models/serializer/PostJSonSerializer.java</code></p><pre class="crayon-plain-tag">package models.serializer;

import java.lang.reflect.Type;

import models.Post;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

public class PostJSonSerializer implements JsonSerializer&lt;Post&gt; {
    public static PostJSonSerializer instance;

    private PostJSonSerializer() {
    }

    public static PostJSonSerializer get() {
        if (instance == null) {
            instance = new PostJSonSerializer();
        }
        return instance;
    }

    public JsonElement serialize(Post post, Type type, JsonSerializationContext jsonSerializationContext) {
        JsonObject obj = new JsonObject();
        obj.addProperty(&quot;author&quot;, post.author);
        obj.addProperty(&quot;title&quot;, post.title);
        obj.add(&quot;comments&quot;, jsonSerializationContext.serialize(post.comments));
        return obj;
    }
}</pre><p></p>
<p><code>app/models/serializer/CommentJSonSerializer.java</code></p><pre class="crayon-plain-tag">package models.serializer;

import java.lang.reflect.Type;
import models.Comment;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

public class CommentJSonSerializer implements JsonSerializer&lt;Comment&gt; {
    public static CommentJSonSerializer instance;

    private CommentJSonSerializer() {
    }

    public static CommentJSonSerializer get() {
        if (instance == null) {
            instance = new CommentJSonSerializer();
        }
        return instance;
    }

    public JsonElement serialize(Comment comment, Type type, JsonSerializationContext jsonSerializationContext) {
        JsonObject obj = new JsonObject();
        obj.addProperty(&quot;author&quot;, comment.author);
        obj.addProperty(&quot;content&quot;, comment.content);
        return obj;
    }
}</pre><p></p>
<p>On modifie par la suite l&#8217;appel à la méthode <code>renderJSon</code> dans le fichier <code>app/controllers/Application.java</code>:</p><pre class="crayon-plain-tag">...
    public static void index() {
        List&lt;Post&gt; posts = Post.findAll();
        renderJSON(posts, PostJSonSerializer.get(), CommentJSonSerializer.get());
    }
...</pre><p></p>
<h2>Résultat final</h2>
<p>Rafraîchissez l&#8217;adresse <a href="http://localhost:9000">http://localhost:9000</a> pour obtenir le résultat suivant :</p><pre class="crayon-plain-tag">[
   {
      &quot;author&quot;:&quot;moi&quot;,
      &quot;title&quot;:&quot;Post 1&quot;,
      &quot;comments&quot;:[
         {
            &quot;author&quot;:&quot;moi&quot;,
            &quot;content&quot;:&quot;du Contenu&quot;
         },
         {
            &quot;author&quot;:&quot;moi&quot;,
            &quot;content&quot;:&quot;du Contenu&quot;
         }
      ]
   },
   {
      &quot;author&quot;:&quot;moi&quot;,
      &quot;title&quot;:&quot;Post 2&quot;,
      &quot;comments&quot;:[
         {
            &quot;author&quot;:&quot;moi&quot;,
            &quot;content&quot;:&quot;du Contenu&quot;
         }
      ]
   }
]</pre><p></p>
<p>ps: Je vous livre ici mes observations sur le fonctionnement des <code>JSonSerializer</code>. Si vous voyez une façon de mieux les écrire, ou de mieux faire n&#8217;hésitez pas à commenter ce billet.</p>
<hr />
<p><small>© nicogiard pour <a href="http://www.noocodecommit.com/blog/nicogiard">NooCodeCommit</a>, 2011. |
<a href="http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-circular-reference-avec-renderjson">Permalink</a> |
<a href="http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-circular-reference-avec-renderjson#comments">4 commentaires</a> 
<br/>
Tags: <a href="http://www.noocodecommit.com/blog/nicogiard/tag/play" rel="tag">Play</a>, <a href="http://www.noocodecommit.com/blog/nicogiard/tag/tips" rel="tag">Tips</a><br/>
</small></p><img src="http://feeds.feedburner.com/~r/noocodecommit/~4/j5lPXb80wOQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-circular-reference-avec-renderjson/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-circular-reference-avec-renderjson</feedburner:origLink></item>
		<item>
		<title>Play! Framework Tips : un renderArgs.put dans un @After sert t’il à quelque chose</title>
		<link>http://feedproxy.google.com/~r/noocodecommit/~3/nfyXOYKHjVM/play-framework-tips-un-renderargs-put-dans-un-after-sert-til-a-quelque-chose</link>
		<comments>http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-un-renderargs-put-dans-un-after-sert-til-a-quelque-chose#comments</comments>
		<pubDate>Mon, 05 Sep 2011 14:36:33 +0000</pubDate>
		<dc:creator>nicogiard</dc:creator>
				<category><![CDATA[Play]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.noocodecommit.com/blog/nicogiard/?p=1055</guid>
		<description><![CDATA[Considérons le contrôleur suivant : app/controllers/Application.java [crayon-51556038e3f1f/] Ainsi que le template associé : app/views/Application/redirect.html [crayon-51556038e3f77/] Lequel des trois prénoms suivants, Michel, Serge et Robert, va t&#8217;il s&#8217;afficher dans votre navigateur à l&#8217;adresse http://localhost:9000 ? La réponse est Robert. Conclusion : Un renderArgs.put dans un @After ne sert à rien! © nicogiard pour NooCodeCommit, 2011. &#124; <a href='http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-un-renderargs-put-dans-un-after-sert-til-a-quelque-chose' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>Considérons le contrôleur suivant :</p>
<p><code>app/controllers/Application.java</code></p><pre class="crayon-plain-tag">package controllers;

import play.mvc.After;
import play.mvc.Before;
import play.mvc.Controller;

public class Application extends Controller {

    @Before
    static void before() {
        System.out.println(&quot;before&quot;);
        renderArgs.put(&quot;nom&quot;, &quot;Michel&quot;);
    }

    @After
    static void after() {
        System.out.println(&quot;after&quot;);
        renderArgs.put(&quot;nom&quot;, &quot;Serge&quot;);
    }

    public static void index() {
        System.out.println(&quot;index&quot;);
        redirect();
    }
    public static void redirect() {
        System.out.println(&quot;redirect&quot;);
        renderArgs.put(&quot;nom&quot;, &quot;Robert&quot;);
        render();
    }
}</pre><p></p>
<p>Ainsi que le template associé :<br />
<code>app/views/Application/redirect.html</code></p><pre class="crayon-plain-tag">#{extends 'main.html' /}
#{set title:'Home' /}

${nom}</pre><p></p>
<p>Lequel des trois prénoms suivants, <em>Michel</em>, <em>Serge</em> et <em>Robert</em>, va t&#8217;il s&#8217;afficher dans votre navigateur à l&#8217;adresse <a href="http://localhost:9000">http://localhost:9000</a> ?</p>
<p>La réponse est <code><strong>Robert</strong></code>. </p>
<p><strong>Conclusion</strong> : Un <code>renderArgs.put</code> dans un <code>@After</code> ne sert à rien!</p>
<hr />
<p><small>© nicogiard pour <a href="http://www.noocodecommit.com/blog/nicogiard">NooCodeCommit</a>, 2011. |
<a href="http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-un-renderargs-put-dans-un-after-sert-til-a-quelque-chose">Permalink</a> |
<a href="http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-un-renderargs-put-dans-un-after-sert-til-a-quelque-chose#comments">5 commentaires</a> 
<br/>
Tags: <a href="http://www.noocodecommit.com/blog/nicogiard/tag/play" rel="tag">Play</a>, <a href="http://www.noocodecommit.com/blog/nicogiard/tag/tips" rel="tag">Tips</a><br/>
</small></p><img src="http://feeds.feedburner.com/~r/noocodecommit/~4/nfyXOYKHjVM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-un-renderargs-put-dans-un-after-sert-til-a-quelque-chose/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-un-renderargs-put-dans-un-after-sert-til-a-quelque-chose</feedburner:origLink></item>
		<item>
		<title>Play! Framework Tips : Attention au Controller nommé “Tags”</title>
		<link>http://feedproxy.google.com/~r/noocodecommit/~3/zZefqruwVqY/play-framework-tips-attention-au-controller-nomme-tags</link>
		<comments>http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-attention-au-controller-nomme-tags#comments</comments>
		<pubDate>Mon, 05 Sep 2011 12:32:51 +0000</pubDate>
		<dc:creator>nicogiard</dc:creator>
				<category><![CDATA[Play]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.noocodecommit.com/blog/nicogiard/?p=1050</guid>
		<description><![CDATA[Imaginez que vous ayez un objet Model Tag, et que vous souhaitiez avoir un contrôleur dédié à la gestion de ces objets. Vous le nommeriez tout naturellement controllers.Tags. Ce qui implique que vous ayez un répertoire app/view/Tags pour vos templates. Ensuite imaginez que vous ayez besoin pour vos templates de créer des tags Play! personnalisés. <a href='http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-attention-au-controller-nomme-tags' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>Imaginez que vous ayez un objet Model <code>Tag</code>, et que vous souhaitiez avoir un contrôleur dédié à la gestion de ces objets. Vous le nommeriez tout naturellement <code>controllers.Tags</code>.</p>
<p>Ce qui implique que vous ayez un répertoire <code>app/view/Tags</code> pour vos templates.</p>
<p>Ensuite imaginez que vous ayez besoin pour vos templates de créer des tags Play! personnalisés. Le framework s&#8217;attend à les avoir dans un répertoire nommé <code>app/view/tags</code>.</p>
<p>Vous commencez à voir où il pourrait y avoir un problème ?</p>
<p>Et oui, Play! sur Windows (qui est un système que je conchie) hérite du &#8220;case insensitive&#8221; de l&#8217;OS. Ce qui fait que pour lui, il n&#8217;y a pas de différence entre <code>app/view/Tags</code> et <code>app/view/tags</code>.<br />
Play! sur Linux, qui lui est case sensitive, voit une différence, et donc ne trouve pas vos templates de tags placés dans le répertoire <code>app/view/Tags</code>.</p>
<p>En conclusion il faut donc faire attention à ne pas nommer un de vos contrôleurs <code>Tags</code> pour éviter tout problème avec les mécanismes internes du framework.</p>
<hr />
<p><small>© nicogiard pour <a href="http://www.noocodecommit.com/blog/nicogiard">NooCodeCommit</a>, 2011. |
<a href="http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-attention-au-controller-nomme-tags">Permalink</a> |
<a href="http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-attention-au-controller-nomme-tags#comments">2 commentaires</a> 
<br/>
Tags: <a href="http://www.noocodecommit.com/blog/nicogiard/tag/play" rel="tag">Play</a>, <a href="http://www.noocodecommit.com/blog/nicogiard/tag/tips" rel="tag">Tips</a><br/>
</small></p><img src="http://feeds.feedburner.com/~r/noocodecommit/~4/zZefqruwVqY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-attention-au-controller-nomme-tags/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.noocodecommit.com/blog/nicogiard/tips/play-framework-tips-attention-au-controller-nomme-tags</feedburner:origLink></item>
		<item>
		<title>Play! Framework Snippet : Basic Authentication</title>
		<link>http://feedproxy.google.com/~r/noocodecommit/~3/z2aZcnmZzW8/play-framework-snippet-basic-authentication</link>
		<comments>http://www.noocodecommit.com/blog/nicogiard/play/play-framework-snippet-basic-authentication#comments</comments>
		<pubDate>Mon, 05 Sep 2011 09:23:39 +0000</pubDate>
		<dc:creator>nicogiard</dc:creator>
				<category><![CDATA[Play]]></category>
		<category><![CDATA[Snippet]]></category>

		<guid isPermaLink="false">http://www.noocodecommit.com/blog/nicogiard/?p=1037</guid>
		<description><![CDATA[Je commence cette série de snippet pour Play! Framework par une méthode très simple pour gérer une authentification &#8220;Basic&#8221; : Ajouter à votre contrôleur la méthode @Before suivante : [crayon-51556038e4f30/] Ainsi, toutes les actions que vous appellerez dans ce contrôleur devront être authentifiées pour aboutir. © nicogiard pour NooCodeCommit, 2011. &#124; Permalink &#124; Pas de <a href='http://www.noocodecommit.com/blog/nicogiard/play/play-framework-snippet-basic-authentication' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>Je commence cette série de snippet pour Play! Framework par une méthode très simple pour gérer une authentification &#8220;Basic&#8221; :</p>
<p>Ajouter à votre contrôleur la méthode @Before suivante :</p>
<p></p><pre class="crayon-plain-tag">public class MyController extends Controller {
    @Before
    static void basicAuth() {
        if (StringUtils.isBlank(request.user) &amp;&amp; StringUtils.isBlank(request.password)) {
            unauthorized(&quot;Veuillez saisir vos identifiants&quot;);
        } else {
            User user = User.find(&quot;login=? and password=?&quot;, request.user, request.password).first();
            if (user == null) {
                unauthorized(&quot;Identifiants inconnus&quot;);
            }
        }
    }
    
    public static void index() {
        render();
    }
}</pre><p></p>
<p>Ainsi, toutes les actions que vous appellerez dans ce contrôleur devront être authentifiées pour aboutir.</p>
<hr />
<p><small>© nicogiard pour <a href="http://www.noocodecommit.com/blog/nicogiard">NooCodeCommit</a>, 2011. |
<a href="http://www.noocodecommit.com/blog/nicogiard/play/play-framework-snippet-basic-authentication">Permalink</a> |
<a href="http://www.noocodecommit.com/blog/nicogiard/play/play-framework-snippet-basic-authentication#comments">Pas de commentaire</a> 
<br/>
Tags: <a href="http://www.noocodecommit.com/blog/nicogiard/tag/play" rel="tag">Play</a>, <a href="http://www.noocodecommit.com/blog/nicogiard/tag/snippet" rel="tag">Snippet</a><br/>
</small></p><img src="http://feeds.feedburner.com/~r/noocodecommit/~4/z2aZcnmZzW8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.noocodecommit.com/blog/nicogiard/play/play-framework-snippet-basic-authentication/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.noocodecommit.com/blog/nicogiard/play/play-framework-snippet-basic-authentication</feedburner:origLink></item>
		<item>
		<title>HTML5 &amp; GIT au NormandyJUG</title>
		<link>http://feedproxy.google.com/~r/noocodecommit/~3/NS6ha-Lb90Q/html5-git-au-normandyjug</link>
		<comments>http://www.noocodecommit.com/blog/nicogiard/news/html5-git-au-normandyjug#comments</comments>
		<pubDate>Thu, 25 Nov 2010 19:04:21 +0000</pubDate>
		<dc:creator>nicogiard</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[NormandyJUG]]></category>

		<guid isPermaLink="false">http://www.noocodecommit.com/blog/nicogiard/?p=1021</guid>
		<description><![CDATA[Soirée de fin d&#8217;année 2010 exceptionnelle ! Venez nombreux le mardi 14 décembre à partir de 19h00 à l&#8217;eXia/CESI de Rouen/Mont Saint Aignan Avec deux sujets phare du moment, le Normandy JUG termine l&#8217;année en beauté ! HTML5 &#38; GIT Inscriptions Obligatoire sur JugEvents.org (...)Lire la suite (244 mots) © nicogiard pour NooCodeCommit, 2010. &#124; <a href='http://www.noocodecommit.com/blog/nicogiard/news/html5-git-au-normandyjug' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<h2>Soirée de fin d&#8217;année 2010 exceptionnelle !</h2>
<p>Venez nombreux<strong> le mardi 14 décembre à partir de 19h00</strong> à <a href="http://maps.google.fr/maps?oe=utf-8&#038;rls=com.ubuntu:en-US:official&#038;client=firefox-a&#038;um=1&#038;ie=UTF-8&#038;q=eXia+CESI+Rouen&#038;fb=1&#038;gl=fr&#038;hq=eXia+CESI&#038;hnear=Rouen&#038;cid=0,0,14303900307713815448&#038;ei=VLLMSrNth5OMB4j5_YIH&#038;sa=X&#038;oi=local_result&#038;ct=image&#038;resnum=1">l&#8217;eXia/CESI de Rouen/Mont Saint Aignan</a><br />
Avec deux sujets phare du moment, le Normandy JUG termine l&#8217;année en beauté !</p>
<h3>HTML5 &amp; GIT</h3>
<p><center>Inscriptions Obligatoire sur <a href="http://jugevents.org/jugevents/event/32001">JugEvents.org</a></center></p>
<p>(...)<br/><a href="http://www.noocodecommit.com/blog/nicogiard/news/html5-git-au-normandyjug">Lire la suite</a> <em>(244 mots)</em></p>
<hr />
<p><small>© nicogiard pour <a href="http://www.noocodecommit.com/blog/nicogiard">NooCodeCommit</a>, 2010. |
<a href="http://www.noocodecommit.com/blog/nicogiard/news/html5-git-au-normandyjug">Permalink</a> |
<a href="http://www.noocodecommit.com/blog/nicogiard/news/html5-git-au-normandyjug#comments">Pas de commentaire</a> 
<br/>
Tags: <a href="http://www.noocodecommit.com/blog/nicogiard/tag/news" rel="tag">News</a>, <a href="http://www.noocodecommit.com/blog/nicogiard/tag/normandyjug" rel="tag">NormandyJUG</a><br/>
</small></p><img src="http://feeds.feedburner.com/~r/noocodecommit/~4/NS6ha-Lb90Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.noocodecommit.com/blog/nicogiard/news/html5-git-au-normandyjug/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.noocodecommit.com/blog/nicogiard/news/html5-git-au-normandyjug</feedburner:origLink></item>
	</channel>
</rss>
