Guide de Migration. Intégration de Spring. Version x.y du 28/03/2008. Etat : xxx



Documents pareils
Création d une application JEE

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Spring par la pratique

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

1. Installation d'un serveur d'application JBoss:

Construction d'une application MVC distribuée avec Spring Remoting. Partie 1 : HttpInvoker, Hessian, Burlap, RMI

Gestion du service des enseignements

Programmer en JAVA. par Tama

Auto-évaluation Aperçu de l architecture Java EE

Tutoriel d installation de Hibernate avec Eclipse

Rapport de projet de fin d études

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Java DataBaseConnectivity

Bases Java - Eclipse / Netbeans

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

JavaServer Pages (JSP)

Compte Rendu d intégration d application

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Alfstore workflow framework Spécification technique

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Création d un service web avec NetBeans 5.5 et SJAS 9

Pentaho. présentation

Composants Logiciels. Le modèle de composant de CORBA. Plan

Application web de gestion de comptes en banques

TP1 : Initiation à Java et Eclipse

as Architecture des Systèmes d Information

CQP Développeur Nouvelles Technologies (DNT)

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

EXA1415 : Annotations

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Auto-évaluation Programmation en Java

Création d objet imbriqué sous PowerShell.

Design patterns. Design patterns - définition. Design patterns - avantages

Ré-architecture et migration d une application standalone vers un serveur applicatif multi-tiers dans un contexte JAVA-SAP

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Groupe Eyrolles, 2005, ISBN :

Une introduction à la technologie EJB (2/3)

Dis papa, c est quoi un bus logiciel réparti?

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Expert technique J2EE

Programmation par les Objets en Java

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Architecture Orientée Service, JSON et API REST

Glassfish dans le milieu médical. Sun Aquarium Paris 26 Juin 2009 Jacky Renno

Programmation par composants (1/3) Programmation par composants (2/3)

PROGRAMMATION PAR OBJETS

Remote Method Invocation (RMI)

La gestion de la persistance avec Hibernate. Hibernate et la gestion de persistance. La gestion de la persistance (1/2) Introduction

Plateforme PAYZEN. Définition de Web-services

Développement Web - Object Relational Mapping and Hibernate

Web Tier : déploiement de servlets

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

Introduction à Eclipse

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Environnements de développement (intégrés)

Initiation à JAVA et à la programmation objet.

Formation Esup-Commons V2

Java Licence professionnelle CISII,

Maîtriser le menu contextuel dans un OfficeBean

Une introduction à Java

JOnAS 5. Serveur d application d

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

Programmation Orientée Objet

Remote Method Invocation Les classes implémentant Serializable

Moderniser. le système d information et le portefeuille applicatif.

Programmation Objet Java Correction

Applet pour visualiser les variables «automate» notifiées

Héritage presque multiple en Java (1/2)

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Open Source Job Scheduler. Installation(s)

RMI le langage Java XII-1 JMF

Plan du cours. Historique du langage Nouveautés de Java 7

Corrigé des exercices sur les références

Chapitre 10. Les interfaces Comparable et Comparator 1

Projet Java EE Approfondi

Cours 1: Java et les objets

Programmation en Java IUT GEII (MC-II1) 1

Développement Logiciel

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Urbanisation des SI Conduite du changement IT 20/03/09. Patrick CHAMBET

Traitement de données

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.

J2EE - Introduction. Développement web - Java. Plan du chapitre

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Java Naming and Directory Interface

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

TP Programmation Java / JDBC / Oracle

TP au menu «UI ANDROID»

La base de données XML exist. A. Belaïd

Transcription:

Intégration de Spring Version x.y du 28/03/2008 Etat : xxx

SUIVI DES MODIFICATIONS Version Rédaction Description Vérification Date 1.0 G.PICAVET C.ROCHETEAU K.COIFFET Première version 28/03/08 Document validé dans sa version xxx LISTE DE DIFFUSION Organisation Nom Info Commentaire Validation Version x.y du 28/03/2008 Etat : xxx Page 2/13

SOMMAIRE SUIVI DES MODIFICATIONS...2 LISTE DE DIFFUSION...2 SOMMAIRE...3 1 MOTIVATIONS...4 2 COMPATIBILITE...5 3 PROCEDURES DE MIGRATION...6 3.1 remplacement du pattern Delegate/DaoFactory...6 3.2 Gestion des datasources et transactions (facultatif)...10 3.3 Gestion des tests unitaires...12 3.3.1 test unitaire via annotations...12 DOCUMENTS DE REFERENCE Version Titre Version x.y du 28/03/2008 Etat : xxx Page 3/13

1 MOTIVATIONS Fournir une procédure d intégration de Spring dans un projet Acube. L intérêt de Spring est de fournir un socle serveur robuste, notamment pour : centraliser la configuration de la partie serveur d une application dans un fichier xml normalisé et assembler les objets à partir d une fabrique unique. réduire l'adhérence vers le socle technique afin de réutiliser le code dans un environnement différent (tests unitaire) faciliter l intégration d autres librairies (Struts, Spring security, Spring batch, IBatis,...) Préciser les points de contrôle pour vérifier la compatibilité ascendante. Version x.y du 28/03/2008 Etat : xxx Page 4/13

2 COMPATIBILITE compatibilité avec la couche dao existante et JDBCWrapper. Version x.y du 28/03/2008 Etat : xxx Page 5/13

3 PROCEDURES DE MIGRATION 3.1 REMPLACEMENT DU PATTERN DELEGATE/DAOFACTORY Le but est de remplacer les classes delegate par des classes de service (au sens SOA) réutilisables. La configuration de l objet DAO à injecter dans le service ne se fait plus dans dao.properties mais avec Spring. 1. Vérifier la compilation et le bon fonctionnement de l application à migrer 2. Ajouter les jars suivants de l application à migrer : spring.jar cglib-nodep-2.1_3.jar 3. Créer un fichier appcontext.xml dans Serveur/src : <?xml version="1.0" encoding="utf-8"?> <!-- Configuration Spring pour la couche métier. --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemalocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" > <!-- ========================= couche BUSINESS ========================= - </beans> <!-- ========================= couche DAO ========================= --> 4. Dans WEB-INF/web.xml, ajouter les lignes suivantes : <!-- Indique au ContextLoaderListener où sont les fichiers de configuration Spring --> <context-param> <param-name>contextconfiglocation</param-name> <param-value> classpath:appcontext.xml Version x.y du 28/03/2008 Etat : xxx Page 6/13

</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.contextloaderlistener </listener-class> </listener> 5. Vérifier le démarrage de l application et le chargement de Spring. 6. dans le fichier appcontext.xml, en dessous du commentaire «couche DAO», définir un bean pour chaque clé de DAO définie dans le fichier dao.properties. Exemple : Si dans dao.properties on a : dao.delegate.example = \ acube.projet.integration.exampledaojdbc Créer un bean dans appcontext.xml : <!-- ========================= couche DAO ========================= --> <bean id="exampledao" class="acube.projet.integration.exampledaojdbc"> </bean> Remarque : pour créer un mode «test», il suffira de créer un fichier «appcontext-test.xml» référençant les dao de test au lieu des dao jdbc. Ce fichier sera normalement chargé par les classes de test unitaire plutôt que le contexte. 7. Pour chaque classe ayant un stéréotype Delegate : remplacer le code suivant : public class ExampleDelegate { / <code>fichierconfigdao</code> fichier de configuration des DAO / private static Configuration fichierconfigdao; / <code>daocle</code>: nom de la cle dans le fichier de properties donnat les classes dao a utiliser / private static String DAO_CLE = "dao.delegate.example"; / <code>dao</code> dao / private ExampleDAO dao = null; / Constructeur Version x.y du 28/03/2008 Etat : xxx Page 7/13

Auto_Generated @throws TechnicalException en cas de probleme technique / public ExampleDelegate (ExampleDAO dao) throws TechnicalException { this.dao = dao; // Récupération du type de DAO à mettre en oeuvre try { fichierconfigdao = ConfigurationManager.getInstance("dao"); catch (ConfigurationException maere) { LabelManager paramlib = new LabelManager(); paramlib.addparameter("0", "dao.properties"); logger.error(this_class + Label.getLabel("ERR-TEC-01", paramlib)); throw new TechnicalException(new ErrorVO("ERR-TEC-01", Label.getLabel("ERR-TEC-01", paramlib), maere.getmessage(), true, false, false)); String dao = Tools.obtenirValeur(fichierConfigDAO, "dao.properties", DAO_CLE); // Recuperation du DAO this.dao = getdao(dao); / Méthode permettant de créer un DAO en utilisant sa Factory. Auto_Generated @param name : nom du DAO. @return : un objet de type com.eds.acube.db.schema.table@131dddcdao. @throws TechnicalException en cas de probleme de recuperation du dao / public ExampleDAO getdao(string name) throws TechnicalException { DAOFactory daofactory = new DAOFactoryImpl(); ExampleDAO dao = (ExampleDAO) daofactory.createdao(name); return dao; Par celui-ci : Version x.y du 28/03/2008 Etat : xxx Page 8/13

public class ExampleDelegate { / <code>dao</code> dao / private ExampleDAO dao = null; / Constructeur Auto_Generated / public ExampleDelegate (ExampleDAO dao) { this.dao = dao; A l aide d Eclipse (via refactor/rename), changer le suffixe Delegate en Service Créer un bean dans appcontext.xml : <!-- ========================= couche Business ========================= --> <bean id="exampleservice" class="acube.projet.business.exampleservice"> <constructor-arg ref="exampledao"/> </bean> 8. Intégration aux classes d action. Les classes d action référençant le service (anciennement le delegate) ne compilent plus, puisque le constructeur par défaut n existe plus. Il faut maintenant déléguer l instanciation du service et la résolution du dao à Spring. Première méthode : appel direct à la factory de Spring Cas d une action Struts 1 : WebApplicationContext webcontext = WebApplicationContextUtils.getWebApplicationContext(getServlet().getServletContext()); ExampleService delegate = (ExampleService) webcontext.getbean("exampleservice"); Cas d une action Struts 2 : WebApplicationContext webcontext = WebApplicationContextUtils.getWebApplicationContext(ServletActionContext Version x.y du 28/03/2008 Etat : xxx Page 9/13

.getservletcontext()); ExampleService delegate = (ExampleService) webcontext.getbean("exampleservice "); Remarque :il est recommandé de factoriser ce code dans une superclasse Action du projet, afin de réduire la dépendance vers Spring à cette seule classe. Deuxième méthode : injection automatique de l objet service dans la classe action. Nécessite le plugin d intégration de Struts (1 ou 2), qui permet à Struts de déléguer l instanciation des classes Action à Spring. Cas de Struts 1 : Voir : http://static.springframework.org/spring/docs/2.5.x/reference/webintegration.html#struts Cas de Struts 2 : Voir : http://struts.apache.org/2.x/docs/spring-plugin.html 3.2 GESTION DES DATASOURCES ET TRANSACTIONS (FACULTATIF) Une version modifiée du JDBCWrapper permet d utiliser une datasource définie dans le fichier appcontext.xml (et non plus dans server.properties). Avec ce système, la gestion des transactions devient également possible au travers de Spring. Intérêts : -remplacement de la classe TransactionManager et des intrications avec le JdbcWrapper, -la démarcation des transactions se fait plus simplement au niveau de la couche service (via les annotations ou en xml), - pas d exception JDBCWrapper au niveau de la couche service (encapsulation), -les transactions imbriquées sont gérées, -possibilité de datasources multiples via JTA, 1. Ajouter la configuration suivante dans appcontext.xml <!-- ========================= ressources ========================= --> <!-- Datasource standalone, sans pool de connexion, afin de fonctionner avec un hsqldb en mode In-Process --> <bean id="datasource" class="org.springframework.jdbc.datasource.drivermanagerdatasource" destroymethod="close"> <property name="driverclassname" value="com.mysql.jdbc.driver"/> Version x.y du 28/03/2008 Etat : xxx Page 10/13

<property name="url" value="jdbc:mysql://130.177.222.253:3306/gestion_contacts"/> <property name="username" value="contacts_dbo"/> </bean> <property name="password" value="contacts_dbo"/> <!-- Transaction manager pour une unique DataSource JDBC --> <bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource"/> </bean> <!-- Instruct Spring to perform declarative transaction management automatically on annotated classes. --> <tx:annotation-driven transaction-manager="txmanager"/> <bean id="jdbcwrapper" class="acube.projet.technical.jdbcwrapper"> <constructor-arg ref="datasource"/> </bean> 2. Pour chaque classe DAOJdbc : remplacer le constructeur par défaut par un constructeur avec jdbcwrapper : private JDBCWrapper jdbcwrapper; / Constructeur Auto_Generated @throws TechnicalException en cas de probleme technique / public ExampleDAOJdbc(JDBCWrapper jdbcwrapper) throws TechnicalException { this. jdbcwrapper = jdbcwrapper dans appcontext.xml, modifier le bean dao de manière à injecter le jdbcwrapper : <bean id="exampledao" class="acube.projet.integration.exampledaojdbc"> <constructor-arg ref="jdbcwrapper"/> </bean> 3. Supprimer les références au TransactionManager (et probablement le try,catch) et utiliser l annotation @Transactional autour des méthodes ou classes nécessitant l utilisation d une transaction. Exemple dans une Action : Version x.y du 28/03/2008 Etat : xxx Page 11/13

@Transactional protected ArrayList getbeansactions(httpservletrequest request) throws DAOException, FunctionalException, TechnicalException, JDBCWrapperException { appelservice1(); appelservice2(); 3.3 GESTION DES TESTS UNITAIRES 3.3.1 TEST UNITAIRE VIA ANNOTATIONS 1. créer un répertoire Serveur/lib et copier les jars suivants : junit-4.4.jar spring-test.jar 2. créer un répertoire source Serveur/srctest 3. Créer une classe pour chaque test unitaire, dans le même package que la classe testée. Exemple de classe de test : 1: @RunWith(SpringJUnit4ClassRunner.class) 2: @ContextConfiguration(locations={"/appContext.xml") public final class ExampleServiceTest { / auto-injection via Spring / 3: @Autowired private ExampleService exampleservice; 4: @org.junit.test public void test() throws Exception { List<ExampleVO> utils = exampleservice.listbyrole("utilisateur"); Assert.assertEquals(1, utils.size()); 1 : annotations indiquant le runner junit utilisé (ici celui de Spring pour JUnit 4) 2 : annotations indiquant le fichier de configuration de Spring à utiliser 3 : annotations indiquant que la la dépendance sera automatiquement résolu par Spring (la correspondance se fait sur le nom et le type java du bean défini dans appcontext.xml) Version x.y du 28/03/2008 Etat : xxx Page 12/13

4 : annotations indiquant que la méthode est un test (excutable par le runner junit) Version x.y du 28/03/2008 Etat : xxx Page 13/13