You are here

Play 2.2 et intégration Spring

Nicolas's picture
Submitted by Nicolas on Fri, 22/11/2013 - 11:09

Dans le cadre d'un projet personnel je me suis laissé tenter par l'utilisation de Play! 2.2 pour la partie web REST en conjonction de l'utilisation de Spring pour tout ce qui est backoffice.

Pour rappel Play! est un framework basé sur une architecture stateless (java/scala) permettant de réaliser des applications web. L'idée d'utliser un autre framework java éprouvé pour la partie backoffice tient au fait que je suis plus habitué à celui-ci qu'à Play! et que mes essais avec la partie persistence de Play! ne m'ont pas totalement convaincu.

Ceci étant dit ajouter spring à Play! 2.2 est assez simple comme nous allons le voir. Basiquement il nous faut changer la façon de gérer le contexte applicatif, ajouter le fichier de configuration de la partie spring et définir les bonnes dépendances pour sbt.

Attaquons nous tout de suite à la partie gestion du contexte. Nous allons surcharger le fonctionnement de Play! en déclarant la classe suivante :

import org.springframework.context.*;
import org.springframework.context.support.*;
import play.Application;
import play.GlobalSettings;

public class Global extends GlobalSettings{

    private ApplicationContext ctx;

    @Override
    public void onStart(Application app) {
        ctx = new ClassPathXmlApplicationContext("components.xml");
    }

    @Override
    public <A> A getControllerInstance(Class<A> controllerClass) throws Exception {
        return ctx.getBean(controllerClass);
    }
}

Une fois cette modification faite il faut utiliser les controlleurs de façon non statique ce qui est fait en ajoutant un @ à la définition de notre controlleur dans le fichier conf/routes. Pour la page index par exemple :

   GET     /                           @controllers.Application.index()

La classe du controlleur étant quand à elle la suivante :

package controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import orga.IUserServiceORGA;

import play.mvc.Controller;
import play.mvc.Result;
import stocks.database.entites.User;
import stocks.services.business.IUserService;
import views.html.index;

import java.security.NoSuchAlgorithmException;

@org.springframework.stereotype.Controller
public class Application extends Controller {

    @Autowired
    private IUserServiceORGA uService;

    public Result index() throws NoSuchAlgorithmException {
        uService.login("test", "test"); // simple appel pour vérifier l'auto-wiring correct de la dépendance Spring
        return ok(index.render("toto"));
    }

}