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

<channel>
	<title>aina.razafimahefa - In Fine - Le Blog</title>
	<atom:link href="https://blog.infine.com/author/aina-razafimahefa/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.infine.com</link>
	<description>Le blog des technos de demain !</description>
	<lastBuildDate>Wed, 24 Apr 2013 16:56:26 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>

<image>
	<url>https://blog.infine.com/wp-content/uploads/2021/03/cropped-vignette-32x32.png</url>
	<title>aina.razafimahefa - In Fine - Le Blog</title>
	<link>https://blog.infine.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>RequestFactory ou comment faire du CRUD avec GWT</title>
		<link>https://blog.infine.com/requestfactory-ou-comment-faire-du-crud-avec-gwt-1108?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=requestfactory-ou-comment-faire-du-crud-avec-gwt</link>
					<comments>https://blog.infine.com/requestfactory-ou-comment-faire-du-crud-avec-gwt-1108#comments</comments>
		
		<dc:creator><![CDATA[aina.razafimahefa]]></dc:creator>
		<pubDate>Fri, 24 Feb 2012 16:54:35 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1108</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span> Historique Lors de la sortie de la version 2.1 de Google Web Toolkit, une nouvelle API : RequestFactory a fait son apparition. Cette API a été conçue dans le but de simplifier l&#8217;interaction et la manipulation de données côté serveur depuis le client (javascript). Auparavant, les développeurs utilisaient essentiellement GWT-RPC pour les appels de service &#8230;</p>
<p>The post <a href="https://blog.infine.com/requestfactory-ou-comment-faire-du-crud-avec-gwt-1108">RequestFactory ou comment faire du CRUD avec GWT</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span><h2>Historique</h2>
<p>Lors de la sortie de la version 2.1 de Google Web Toolkit, une nouvelle API : RequestFactory a fait son apparition. Cette API a été conçue dans le but de simplifier l&#8217;interaction et la manipulation de données côté serveur depuis le client (javascript).<br />
Auparavant, les développeurs utilisaient essentiellement GWT-RPC pour les appels de service impliquant des manipulations de données côté serveur.<br />
Etant donné que le code côté client interagit avec du Java côté serveur, GWT-RPC fournit nativement<br />
un mécanisme de sérialisation de données puissant. Cependant, cela ajoutait également un certain nombre de contraintes. Entres autres, le fait que tout objet échangé entre le client et le serveur devait être Serializable (au sens GWT), l&#8217;utilisation du pattern DTO qui induisait une redondance du code métier serveur au niveau du client etc.</p>
<h2>Différence entre GWT-RPC et RequestFactory</h2>
<p>La différence fondamentale entre les deux API réside dans l&#8217;orientation. GWT-RPC  est une API orientée service. A la base, elle permet d&#8217;invoquer des méthodes distantes d&#8217;une couche service pour interagir avec les données.</p>
<p>RequestFactory quant à elle est une API orientée donnée. Elle invoque directement des méthodes exposées non pas sur une couche service, mais sur les entités métiers (selon la terminologie GWT) elles-mêmes. C&#8217;est comme si on rendait les données serveurs disponibles au niveau du client. Les méthodes invoquées sont alors les méthodes des objets métiers.</p>
<h2>Concepts de base</h2>
<p>RequestFactory se base sur la notion de Proxy. Pour effectuer des opérations sur les données côté serveur, il définit un objet proxy qui &#8220;représente&#8221; cet objet serveur au niveau du client. Ce proxy est en fait une &#8220;interface&#8221; qui définit l&#8217;ensemble des méthodes qu&#8217;on voudrait exposer sur l&#8217;objet métier lui-même. Pour déclencher l&#8217;exécution d&#8217;une action sur l&#8217;objet côté serveur, il suffit de l&#8217;invoquer sur l&#8217;interface du proxy et RequestFactory se charge de l&#8217;envoi de la requête ainsi que de la sérialisation/déserialisation des données. Il est à noter qu&#8217;il utilise un protocole de sérialisation qui lui est propre et qui est différent de GWT-RPC.</p>
<h2>Quelques règles à respecter</h2>
<p>Le fonctionnement interne de RequestFactory impose quelques contraintes au niveau des classes métiers dont :</p>
<p>L&#8217;objet métier doit avoir un constructeur sans argument</p>
<p>la nécéssité d&#8217;avoir un champ VERSION dans la classe métier (annoté @Version en JPA). Ce champ permet à RequestFactory de tester si un objet a changé d&#8217;état.</p>
<p>Chaque Entité doit également disposer d&#8217;une méthode statique permettant de retrouver une instance de l&#8217;objet par son identifiant. Par exemple, pour l&#8217;entité de type Person, ce sera :</p>
<pre class="brush: java; title: ; notranslate">
public static findPerson(Long id) {

// retrieving object by Id using EntityManager

}
</pre>
<h2>Cas d&#8217;utilisation</h2>
<p>Supposons alors qu&#8217;on ait un objet métier Personne dans notre application. Les objets de cette classe sont déstinés à être sauvegardés dans une base de données. On les appelle tout naturellement des &#8220;Entités&#8221; dans RequestFactory. On supposera que la persistance est gérée par Hibernate dans notre application et que tout a déjà été configuré (hibernate.cfg.xml, etc.). Nous avons donc dans notre domaine, le code suivant :</p>
<pre class="brush: java; title: ; notranslate">
@Entity public class Person {
  @Id
@Column(name = &quot;id&quot;)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Version
@Column(name = &quot;version&quot;)
private Integer version;

@Version
@Column(name = &quot;name&quot;)
private String name;
@Column(name = &quot;surname&quot;)
private String surname;

  @JoinColumn(name=&quot;address_id&quot;)
  Address address;

  public Personne() { }  // Getters and setters ...

}
</pre>
<p>Après avoir défini notre objet métier, on va donc lui adjoindre un &#8220;Proxy&#8221; qui sera une représentation de cet objet métier côté client. RequestFactory se charge alors de<br />
propager les opérations invoquées sur les proxy vers les entités côté serveur. Il est également important de noter que RequestFactory envoie seulement les différences entre<br />
ce qu&#8217;il y a côté serveur et côté client, économisant ainsi la bande passante.</p>
<h3>Entity Proxy</h3>
<p>Une entity proxy est un proxy qui comme son nom l&#8217;indique, représente une entité côté serveur. Pour la définir il suffit de créer une interface qui étend EntityProxy<br />
et d&#8217;indiquer la classe métier qu&#8217;il représente via l&#8217;annotation @ProxyFor.</p>
<pre class="brush: java; title: ; notranslate">
@ProxyFor(Person.class)
public interface PersonProxy extends EntityProxy {
public Person() { }
// Les méthodes exposées ...
public String getName();
public void setName(String name);
public AddressProxy getAddress();
public void setAddress(AddressProxy address);
// Les méthodes exposées ...
public String getName();
public void setName(String name);
public AddressProxy getAddress();
public void setAddress(AddressProxy address);
}
</pre>
<p>Les méthodes qu&#8217;on a défini dans le proxy sont les méthodes &#8220;invocables&#8221; sur l&#8217;objet métier. Ainsi, si on veut restreindre l&#8217;appel à certaines méthodes de l&#8217;objet métier<br />
côté serveur, il suffit de ne pas l&#8217;indiquer dans le proxy. Ici par exemple, on a omis les modificateurs de Surname, ce qui veut dire qu&#8217;on ne pourra pas invoquer la méthode<br />
de modification du prénom depuis le côté client.<br />
Remarquons également que si une Entité A possède une référence vers une autre Entité B, les signatures du proxy AProxy feront référence à des BProxy (dans notre cas, AddressProxy).</p>
<h3>Le lien entre le client et le serveur : RequestFactory</h3>
<p>Après avoir défini les entités et leurs proxy, on crée maintenant la RequestFactory elle-même. C&#8217;est une interface qui comme son nom l&#8217;indique va créer les &#8220;stubs&#8221;<br />
permettant la communication entre le client et le serveur.</p>
<pre class="brush: java; title: ; notranslate">
public interface ApplicationRequestFactory extends RequestFactory

{

    PersonRequest personRequest();

    AddressRequest addressRequest();
}
</pre>
<p>PersonRequest et AddressRequest sont nos stubs pour les opérations concernant respectivement les entités Person et Address.</p>
<pre class="brush: java; title: ; notranslate">
@Service(PersonServiceDAO.class)
public interface PersonneRequestContext extends RequestContext {

Request&lt;List&lt;PersonProxy&gt;&gt; getPersonList();

Request&lt;PersonProxy&gt; findPersonById(Long id);

}
</pre>
<p>Notons que les stubs utilisent toujours Request comme type de retour, où X est le paramètre de retour de la méthode de service.<br />
Le stub doit nommer via une annotation, la méthode qui implémente les services côté serveur. Ainsi, dans notre exemple on a deux méthodes qu&#8217;on peut invoquer côté serveur<br />
pour les entités de la classe Personne : on peut retrouver la liste complète ou encore retrouver une Personne par son identifiant.<br />
On pourrait imaginer une classe service comme la suivante ( j&#8217;ai omis volontairement toute la partie de gestion des exceptions liées à la persistance des données pour une raison de lisibilité) :</p>
<pre class="brush: java; title: ; notranslate">
public class PersonServiceDAO {

public List&lt;PersonProxy&gt; getPersonList()
  {
      List&lt;Person&gt; personList = new ArrayList();
      EntityManager entityManager = PersistenceManager.getEntityManagerFactory().createEntityManager();
      try {
          personList = entityManager.createQuery(&quot;FROM Person&quot;).getResultList();
      } catch (Exception e) {
          e.printStackTrace();
      }
      return personList;
  }

public Personne findPersonById(Long id) {
      EntityManager entityManager = PersistenceManager.getEntityManagerFactory().createEntityManager();
      Person person = null;
      try {
          person = entityManager.find(Person.class, id);
      } catch (Exception e) {
          e.printStackTrace();
      }
      return person;
  }
}
</pre>
<h3>Utiliser RequestFactory</h3>
<p>Enfin la dernière étape pour l&#8217;exécution de RequestFactory est de l&#8217;invoquer depuis le code client. Dans un premier temps, on doit initialiser le bus d&#8217;évènement. Une manière de procéder c&#8217;est de faire l&#8217;initialisation dans le constructeur de la classe dans laquelle on va utiliser RequestFactory.</p>
<pre class="brush: java; title: ; notranslate">
public class OurClassWindow {
final EventBus eventBus = new SimpleEventBus();
ApplicationRequestFactory requestFactory = GWT.create(ApplicationRequestFactory.class);

public OurClassWindow() {
// Initialize event bus
requestFactory.initialize(eventBus);
}

}
</pre>
<p>Le mécanisme d&#8217;appels dans RequestFactory est très similaire à ce que l&#8217;on retrouve dans GWT-RPC. Après avoir retrouvé la requestContext, on invoque la méthode tout en<br />
passant un callback qui sera appelé par RequestFactory au retour de la fonction.</p>
<pre class="brush: java; title: ; notranslate">
Receiver&lt;List&lt;PersonProxy&gt;&gt; receiver = new Receiver&lt;List&lt;PersonProxy&gt;&gt;(){
@Override 	public void onSuccess(List&lt;PersonProxy&gt; response) {

// Do something with the response from RequestFactory

} };

requestFactory.personRequestContext.getPersonList().fire(receiver);
</pre>
<p>receiver ici, représente la méthode callback qui sera appelée au retour de la fonction. Comme dans GWT-RPC, il dispose de méthodes onSuccess et onFailure permettant de gérer<br />
les cas de réussite ou d&#8217;échecs après l&#8217;appel.</p>
<h3>Conclusion</h3>
<p>Si vous avez déjà codé en GWT, vous savez à quel point il est fastidieux d&#8217;écrire des services uniquement pour ramener des données stockées en base  : RequestFactory est une manière <del>élégante</del> simple pour effectuer à moindre coût des appels vers un backend. L&#8217;API et la mise en oeuvre sont similaires à ceux de GWT-RPC, il est ainsi très facile de l&#8217;appréhender même si on est habitué à GWT-RPC.</p>
<p>pour aller plus loin : <a href="https://developers.google.com/web-toolkit/doc/latest/DevGuideRequestFactory">https://developers.google.com/web-toolkit/doc/latest/DevGuideRequestFactory</a></p><p>The post <a href="https://blog.infine.com/requestfactory-ou-comment-faire-du-crud-avec-gwt-1108">RequestFactory ou comment faire du CRUD avec GWT</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/requestfactory-ou-comment-faire-du-crud-avec-gwt-1108/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
