Contrairement à RequestFactory qui a une mauvaise gestion des erreurs et des capacités de test (puisqu'il traite la plupart des choses sous le capot de GWT), RPC vous permet d'utiliser une approche plus orientée service. RequestFactory met en œuvre une approche plus moderne de style injection de dépendance qui peut fournir une approche utile si vous avez besoin d'invoquer des structures de données polymorphes complexes. Lorsque vous utilisez RPC, vos structures de données devront être plus plates, car cela permettra à vos utilitaires de mise en forme de traduire entre vos modèles json/xml et java. L'utilisation de RPC vous permet également de mettre en œuvre une architecture plus robuste, comme le cite la section gwt dev du site Web de Google.
"Déploiement simple client/serveur
La première et la plus simple façon d'envisager les définitions de service est de les considérer comme l'ensemble du back-end de votre application. Dans cette perspective, le code côté client est votre "front-end" et tout le code de service qui s'exécute sur le serveur est le "back-end". Si vous adoptez cette approche, vos implémentations de services auront tendance à être des API plus générales qui ne sont pas étroitement liées à une application spécifique. Vos définitions de services sont susceptibles d'accéder directement aux bases de données via JDBC ou Hibernate, voire aux fichiers du système de fichiers du serveur. Ce point de vue est approprié pour de nombreuses applications et peut être très efficace car il réduit le nombre de niveaux.
Déploiement multi-niveaux
Dans des architectures plus complexes, à plusieurs niveaux, vos définitions de services GWT pourraient simplement être des passerelles légères qui appellent à travers des environnements de serveurs back-end tels que les serveurs J2EE. De ce point de vue, vos services peuvent être considérés comme la "moitié serveur" de l'interface utilisateur de votre application. Au lieu d'être polyvalents, les services sont créés pour répondre aux besoins spécifiques de votre interface utilisateur. Vos services deviennent le "front-end" des classes "back-end" qui sont écrites en assemblant des appels à une couche de services back-end plus générale, mise en œuvre, par exemple, comme un cluster de serveurs J2EE. Ce type d'architecture est approprié si vous avez besoin que vos services back-end s'exécutent sur un ordinateur physiquement séparé de votre serveur HTTP."
Notez également que la mise en place d'un seul service RequestFactory nécessite la création d'environ 6 classes java, alors que RPC n'en nécessite que 3. Plus de code == plus d'erreurs et de complexité dans mon livre.
RequestFactory a également un peu plus de frais généraux pendant le traitement de la demande, car il doit mettre en forme la sérialisation entre les proxies de données et les modèles java réels. Cette interface supplémentaire ajoute des cycles de traitement supplémentaires qui peuvent vraiment s'accumuler dans une entreprise ou un environnement de production.
Je ne pense pas non plus que les services RequestFactory soient des services de sérialisation comme les services RPC.
Dans l'ensemble, après avoir utilisé les deux depuis un certain temps maintenant, j'ai toujours opté pour RPC car il est plus léger, plus facile à tester et à déboguer, et plus rapide que l'utilisation d'une RequestFactory. Bien que RequestFactory puisse être plus élégant et extensible que son homologue RPC. La complexité ajoutée ne fait pas de lui un meilleur outil nécessaire.
Je pense que la meilleure architecture est d'utiliser deux applications web, un client et un serveur. Le serveur est une simple application web java générique et légère qui utilise la bibliothèque servlet.jar. Le client est GWT. Vous faites une demande RESTful via GWT-RPC dans le côté serveur de l'application web du client. Le côté serveur du client est juste un passage vers le client apache http qui utilise un tunnel persistant dans le gestionnaire de demande que vous avez exécuté comme un seul servlet dans votre application web servlet serveur. L'application web servlet doit contenir votre couche d'application de base de données (hibernate, cayenne, sql, etc.). Cela vous permet de divorcer complètement les modèles d'objets de base de données du client actuel, ce qui fournit un moyen beaucoup plus extensible et robuste de développer et de tester votre application. D'accord, cela nécessite un peu de temps de configuration initiale, mais à la fin, cela vous permet de créer une usine de requête dynamique en dehors de GWT. Cela vous permet de tirer parti du meilleur des deux mondes. Sans parler de la possibilité de tester et d'apporter des changements à votre côté serveur sans avoir à compiler ou construire le client GWT.