Je suis sur le point de démarrer un projet pour une application Web qui devrait s'exécuter sur un serveur Tomcat. J'ai décidé d'opter pour Scala - l'autre alternative où je travaille étant Groovy - essentiellement pour la sécurité des types. Je suis maintenant confronté à la tâche de choisir les bons outils pour le travail.
Le projet que je devrai développer ne sera accessible que via une API JSON. Il interagira à la fois avec sa propre base de données et avec deux services externes, qui exposent respectivement une API JSON et XML. Je devrai également pouvoir planifier des travaux périodiques où mon application exécutera diverses tâches de synchronisation avec ces services externes.
Pour la base de données, j'aimerais pouvoir définir mes modèles en Scala et générer automatiquement le schéma. Si le besoin se fait sentir de changer mes modèles, j'aimerais avoir des migrations pour le gérer.
Pour cette application, j'essaie d'évaluer Lift, Play! 2 et Scalatra.
Lift était mon premier choix. Il est le plus mature des trois projets et semble être considéré comme hautement sécurisé (je ne veux pas faire de compromis sur la sécurité). De plus, il présente ce qui semble être la meilleure bibliothèque de gestion JSON de Scala. Pourtant, après avoir un peu essayé, je ne suis pas sûr que ce serait le bon choix. La documentation n'est pas exactement la meilleure que j'ai vue. De plus, Record + Squeryl me semble une meilleure abstraction que Mapper, mais la documentation pour cette utilisation est encore plus rare. Enfin, bien que Lift puisse certainement être utilisé pour créer un service web, il semble que sa véritable force réside dans la gestion de l'état, et je ne suis donc pas convaincu que la complexité supplémentaire soit nécessaire pour mon projet.
Play! 2 semble avoir une meilleure documentation, et me semble plus familier (je viens d'un Django background). Encore une fois, son abstraction de base de données par défaut n'a pas vraiment apaisez-moi: ANORM s'appuie sur SQL, ce qui n'aide pas à la vérification de type. Je devrais quand même utiliser Squeryl, et je ne suis pas sûr que la documentation de ce cas d'utilisation soit aussi bonne. De plus, le déploiement d'applications Play! 2 est au moment plus compliqué que je ne le voudrais. Il faut installer Play! sur le serveur de production, et je ne suis pas sûr que ce soit une option où je travaille. Sinon, il y a un plugin pour le faire fonctionner avec des conteneurs de servlets, mais il est très nouveau et je ne sais pas à quel point il est stable/fiable.
Enfin, il y a la possibilité d'utiliser Scalatra. Scalatra semble très facile à configurer, et il est conçu exactement pour créer des services Web. Le compromis est que Scalatra n'offre pas beaucoup de fonctionnalités. Il ne s'intègre pas aux ORM existants et ne suggère pas comment organiser la partie modèle de l'application, et il n'aide pas à concevoir des tâches cron ou de ligne de commande. Je ne suis pas sûr non plus de l'avenir à long terme du projet.
Selon vous, quel serait le meilleur choix pour ma tâche?
Si vous venez d'un milieu MVC, Play vous semblera le plus familier. Lift n'est pas MVC et il faut du temps pour s'enrouler autour de la tête.
Il n'y a aucune raison pour laquelle vous ne pouvez pas utiliser Scala avec un framework basé sur Java comme Jersey, Spring MVC, Dropwizard , Restlet, RESTEasy, etc. Ou vous pourriez utilisez Scala avec Grails comme vous pouvez utiliser Java avec Grails. Remarque - Groovy a la sécurité des types à partir de la version 2.0, donc c'est quelque chose à considérer.
Si vous pensez à Scalatra, n'oubliez pas Spray , Non filtré , BlueEyes ...
N'oubliez pas de consulter Matt Raible comparaison complète des frameworks web . Et ces autres SO questions: Framework Scala pour un serveur API Rest? , Comment implémenter un REST Web Service utilisant Akka?
Bien que vous ayez déjà donné quelques candidats, je vous recommande cet exposé de Tim Perrett (auteur de Lift in Action, dans lequel il compare scala webframeworks: http://skillsmatter.com/ podcast/scala/scalable-language-web