Étiquette : spring

  • Partage de session avec spring-session

    Un collègue m’a fait découvrir spring-session lors d’un échange sur la façon de stocker les sessions dans un tiers.

    J’ai donc décidé de reprendre mon poc pour l’adapter à cette librairie.

    La mise en place est assez simple. Il faut juste créer 2 classes.

    1 pour la configuration (Config) et 1 pour que spring initialise mon application (Initializer). Dans une application existante la dernière classe n’est pas obligatoire. Il suffira de déclarer le bean config dans le fichier de context XML spring.

    • configuration:
    @Configuration
    @EnableRedisHttpSession
    public class Config {
    
          @Bean
          public JedisConnectionFactory connectionFactory() {
                JedisConnectionFactory factory = new JedisConnectionFactory();
                factory.setHostName("db");
                return factory;
          }
    }

    Il suffit de placer l’annotation EnableRedisHttpSession et de déclarer un bean pour la connectionFactory. Par defaut JedisConnectionFactory se connecte sur la base redis en localhost. Dans mon cas, j’ai surchargé pour aller sur le host db (container redis)

    Il faut supprimer aussi le fichier context.xml qui n’est plus nécessaire.
    Il faut passer en servlet 3.0 pour que l’initialisation fonctionne.

    et voilà, c’est tout.

    On peut tester le tout avec les commandes:

    mvn clean install
    ./start_all.sh

     

    • Changements:

    Par rapport au précédent article, le poc a subi quelques modifications pour fonctionner:

    – passage à tomcat 8
    – inclusion de spring 4
    – inclusion de spring web
    – inclusion de spring-data
    – servlet 3.0

    Les sources sont disponibles ici

    Merci Raphaël pour l’info.

     

  • Configurer Selenium par annotations

    Pour faire suite à l’article précédent sur la configuration spring, voici le même type de configuration pour Selenium (outil de test d’intégration pilotant un navigateur).

    On va pouvoir lancer les tests avec seulement 3 classes et 0 xml.

    1 – on définit une classe de configuration qui va contenir l’url de base du site et le driver du navigateur à tester:

    @Configuration
    public class TestConfig {
    
    @Bean
    public URI getSiteBase() throws URISyntaxException {
    return new URI("http://localhost:10001/demo-spring-1.0-SNAPSHOT");
    }
    
    @Bean(destroyMethod = "quit")
    public FirefoxDriver getDrv() {
    return new FirefoxDriver();
    }
    }

    2 – on définit ensuite une classe abstraite qui va référencer la configuration et va contenir un petit « tips » pour ne pas avoir plusieurs processus de firefox en même temps, lorsque qu’on lance plusieurs tests

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes={ TestConfig.class })
    public abstract class AbstractTestIT {
    
    @Autowired
    protected URI siteBase;
    
    @Autowired
    protected WebDriver drv;
    
    {
    Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
    drv.close();
    }
    });
    }
    
    }

    3- et enfin la classe de test qui vérifie que le code du controller est correcte:

    public class HelloControllerTestIT extends AbstractTestIT {
    
    @Test
    public void testHello() {
    drv.get(siteBase.toString()+"/hello");
    assertTrue(drv.getPageSource().contains("Welcome anonymous"));
    }
    
    }

    4- pour que tout s’enchaîne correctement, il faut modifier le pom.xml

    <build>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.12</version>
    <executions>
    <execution>
    <id>default</id>
    <goals>
    <goal>integration-test</goal>
    <goal>verify</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    <plugin>
    <groupId>org.codehaus.cargo</groupId>
    <artifactId>cargo-maven2-plugin</artifactId>
    <version>1.2.0</version>
    <configuration>
    <type>standalone</type>
    <configuration>
    <properties>
    <cargo.servlet.port>10001</cargo.servlet.port>
    </properties>
    </configuration>
    </configuration>
    <executions>
    <execution>
    <id>start</id>
    <phase>pre-integration-test</phase>
    <goals>
    <goal>start</goal>
    </goals>
    </execution>
    <execution>
    <id>stop</id>
    <phase>post-integration-test</phase>
    <goals>
    <goal>stop</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>

    et ajouter les dépendances suivantes:

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-firefox-driver</artifactId>
    <version>2.43.1</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>

    Attention: La version de selenium est fortement lié à la version de firefox. Si l’exemple ne marche pas, il faut vérifier qu’une nouvelle version n’est pas disponible.

    Le lancement de la commande

    mvn verify

    devrait donner un résultat du type:

    Results :
    
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

     

    Les sources sont ici: github

    références:

  • Configurer spring sans fichier XML

    Pour changer un peu de docker, voici un petit article pour initier un projet spring sans fichier de configuration XML.

    Je vais créer une petite application avec un Controller Spring MVC.

    Tout d’abord, on ajoute les dépendances. Servlet 3.1, spring-context , spring mvc suffisent:

    <properties>
    <spring.version>4.1.0.RELEASE</spring.version>
    </properties>
    
    <dependencies>
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
    </dependency>
    </dependencies>

    On va ensuite créer une classe qui va permettre de gérer l’initialisation de la configuration spring. Pour cela, j’utilise une nouveauté de servlet 3.0 qui est  l’interface WebApplicationInitializer:

    public interface WebApplicationInitializer {
    void onStartup(javax.servlet.ServletContext servletContext) throws javax.servlet.ServletException;
    }

    En implémentant une classe avec la méthode onStartup, on peut faire l’initialisation de son application. C’est plus simple que de faire une « fausse » servlet avec un paramètre loadOnStartup dans le fichier web.xml

    Voici le code de la classe que j’utilise:

    public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
    WebApplicationContext context = getContext();
    
    servletContext.addListener(new ContextLoaderListener(context));
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/*");
    }
    
    private AnnotationConfigWebApplicationContext getContext() {
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.setConfigLocation("com.axioconsulting.demo.spring.config");
    return context;
    }
    }

    La méthode getContext va permettre de gérer la configuration par annotation en commençant par le package com.axioconsulting.demo.spring.config.

    Dans ce package, j’ai défini 2 classes.

    @Configuration
    @ComponentScan("com.axioconsulting.demo.spring.controller")
    public class AppConfig {
    }

    L’annotation @Configuration permet à Spring de savoir que cette classe est à prendre en compte pour la configuration. Dans notre cas, on précise juste qu’il faut scanner le package com.axioconsulting.demo.spring.controller (c’est là que va se trouver le controller)

    @Configuration
    @EnableWebMvc
    public class WebMvcConfig {
    }

    Cette classe permet d’importer la configuration spring MVC.

    NB: On aurait pu fusionner les 2 classes.

    Il ne reste plus qu’à mettre en place le controller.

    @Controller
    public class HelloController {
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(@RequestParam(required = false) String name){
    if (StringUtils.isEmpty(name)){
    return "Welcome anonymous";
    }
    return "Hello "+name;
    }
    }

    Il s’agit d’un controller basic qui va répondre un message sur /hello ou sur /hello?name=monNom

    anonyme monNom

    Et voila, on a réussi à initier une appli spring MVC en manipulant seulement des annotations ce qui me parait plus simple.

    A voir sur le long terme et sur un projet un peu plus gros si les annotations sont suffisantes.

    Les sources sont ici:  https://github.com/BenoitCharret/demoSpring