Spring Java découverte

Monday, November 28, 2016

Développer un exemple de microservice complet

Cette section démontre une mise en œuvre de microservice avec Spring Boot .

prérequis: Pour cristalliser les concepts microservices, il est supposé que les composants suivants sont installés dans votre ordinateur.

  • JDK 1.8: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
  • Spring Tool Suite 3.7.2 (STS): https://spring.io/tools/sts/all
  • Maven 3.3.1: https://maven.apache.org/download.cgi
  • Rabbit MQ sera également nécessaire pour cet exemple. Téléchargez et installez la dernière version de Rabbit MQ ici https://www.rabbitmq.com/download.html et suivez les étapes d'installation documentées sur le site. Une fois prêt, démarrez le serveur RabbitMQ via la commande suivante: $./ rabbitmq-server ou plus simple encore via Windows Services. Vous pouvez également installer une interface web pour accéder RabbitMq  en suivant ce guide (en anglais): https://cmatskas.com/getting-started-with-rabbitmq-on-windows/

Dans cet exemple, deux microservices (deux projets jar), le Customer Profile et l'autre, le Customer Notification seront développés:


Comme l'indique le diagramme, le microservice Customer Profile expose des méthodes (CRUD)pour créer(Create), lire(Read), mettre-à-jour(Update) et supprimer(Delete) un Customer en Base de donnees. Le processus d'enregistrement applique une certaine logique métier(Business logic), enregistre le client et envoie un message au microservice Customer notification. Le microservice Customer Notification accepte le message envoyé par le service d'enregistrement et envoie un message électronique au client en utilisant un serveur SMTP.

Le diagramme de modèle de domaine de classe de microservices client est le suivant:



CustomerController dans le diagramme est le REST-endpoint, qui invoque une classe de composante, CustomerComponent (la classe CustomerRegistrar.java annotée @Component). Le composant classe/bean gère toute la logique métier. CustomerRepository est un référentiel Spring Data JPA défini pour gérer la persistance de l'entité Customer.

Codes Sources: Dans cette exemple nous ferrons converser deux applications Spring Boot (deux fichiers jar). Vous pouvez donc télécharger les codes sources complets via github et les importer dans votre Editeur (STS, Eclipse ...)

  1. Customer : https://github.com/Georges73/springbootRabbitMq_1_1
  2. customernotification https://github.com/Georges73/springbootRabbitMqReceiver_1_2

Vous pouvez également suivre manuellement les étapes suivantes :

  1.  Créez un nouveau projet Spring Boot et appelez-le commevousvoulez.customer, de la même manière qu'ici. Sélectionnez les options comme dans la capture d'écran suivante dans l'écran de sélection du module de démarrage:

2. Cela créera un projet Web avec JPA, le référentiel REST et H2 comme base de données. H2 est une petite base de données intégrée en mémoire avec laquelle il est facile de démontrer les fonctionnalités de la base de données. Dans le monde réel, il est recommandé d'utiliser une base de données d'entreprise appropriée (MySql ...). Cet exemple utilise JPA pour définir les entités de persistance et le référentiel REST pour exposer les services de référentiel reposant sur REST.

La structure du projet sera similaire à la capture d'écran suivante:


3. Commencez à créer l'application en ajoutant une classe d'entité nommée Customer. Pour simplifier, il n'y a que trois champs ajoutés à la classe Entité client: le champ ID autogénéré, le nom(name) et le courrier électronique(email). Jetez un coup d'œil au code suivant:


     @Entity
class Customer {
 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 private Long id;
 private String name;
 private String email;
 
 public Customer (){}

 
 public Customer(String name, String email) {
  super();
  this.name = name;
  this.email = email;
 }


 public Long getId() {
  return id;
 }

 public void setId(Long id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getEmail() {
  return email;
 }

 public void setEmail(String email) {
  this.email = email;
 }

 @Override
 public String toString() {
  return "Customer [id=" + id + ", name=" + name + ", email=" + email + "]";
 }
 

4. Ajoutez une classe de repository pour gérer la gestion de la persistance du Customer. CustomerRepository.java étend(extends) le référentiel JpaRepository . Cela signifie que toutes les méthodes CRUD et les méthodes de recherche par défaut sont automatiquement implémentées par le référentiel Spring Data JPA, comme suit:



@RepositoryRestResource
@Lazy
interface CustomerRespository extends JpaRepository {
 Optional findByName(@Param("name") String name);
}
 

Dans cet exemple, nous avons ajouté une nouvelle méthode à la classe de repository, findByName(), qui recherche essentiellement le client en fonction du nom du client et renvoie un objet Customer s'il existe.
4. L'annotation @RepositoryRestResource permet l'accès au repository via les services RESTful. Cela activera également HATEOAS et HAL par défaut. Comme pour les méthodes CRUD il n'ya pas de logique supplémentaire à ajouter, nous allons laisser comme il est sans contrôleur ou des classes de composants. L'utilisation de HATEOAS nous aidera à naviguer sans difficulté dans les méthodes du Customer repository. Beaucoup plus simple et clair donc car moins de verbiages.

Notez qu'il n'y a aucune configuration ajoutée n'importe où pour pointer vers n'importe quelle base de données. Comme les bibliothèques H2 sont dans la class path, toute la configuration est effectuée par défaut par Spring Boot en fonction de la configuration automatique H2. En d'autre termes, lorsque Spring Boot démarrera le projet, il détectera H2 dans le fichier pom.xml localisé dans la classe path et se chargera du reste. Oui, Spring boot fait ca. Fini les longues et fastidieuses configuration de pour établir une connexion avec une base de données.
5. Mettez à jour le fichier Application.java en ajoutant CommandLineRunner pour initialiser le repository avec certains données(name, email) Customer, comme suit:



@RepositoryRestResource
@SpringBootApplication
@EnableRabbit
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    
    @Bean 
    CommandLineRunner init(CustomerRespository customerRepository) {
  return (evt) ->  {
  customerRepository.save(new Customer("Adam","adam@boot.com"));
  customerRepository.save(new Customer("John","john@boot.com"));
  customerRepository.save(new Customer("Smith","smith@boot.com"));
  customerRepository.save(new Customer("Edgar","edgar@boot.com"));
  customerRepository.save(new Customer("Martin","martin@boot.com"));
  customerRepository.save(new Customer("Tom","tom@boot.com"));
  customerRepository.save(new Customer("Sean","sean@boot.com"));

     };
 } }


  • CommandLineRunner, défini comme un @bean, indique qu'il doit s'exécuter lorsqu'il est contenu dans SpringApplication. Cela va insérer les six exemples de donnees Customer dans la base de données au démarrage.
  • À ce stade, exécutez l'application en tant que Spring boot app (run as spring boot app  de la même manière qu'ici.). Ouvrez le navigateur HAL et pointez le navigateur vers http://localhost:8080.
  • dans la section Explorer de votre navigateur HAL vous devez copier et coller : http://localhost:8080/customers et cliquer sur Go. Cette action va répertorier tous les customers dans la section Response Body du navigateur HAL
6.  À l'étape suivante, ajoutez une classe contrôleur, CustomerController.java, pour gérer les noeuds      finaux de service. Il n'y a qu'un seul point d'extrémité (End-point)dans cette classe, /register,                qui est utilisé pour enregistrer un Customer. En cas de succès, il renvoie l'objet Customer comme        réponse, comme suit:


@RestController
class CustomerController{
 
 CustomerRegistrar customerRegistrar;
 
 @Autowired
 CustomerController(CustomerRegistrar customerRegistrar){
  this.customerRegistrar = customerRegistrar;
 }
 
 @RequestMapping( path="/register", method = RequestMethod.POST)
 Customer register(@RequestBody Customer customer){
  return customerRegistrar.register(customer);
 }
}

7. Un composant CustomerRegistrar.java est ajouté pour gérer la logique métier. Dans ce cas, la logique métier est limitée au composant. Dans cette classe de composants, tout en enregistrant un Customer, nous vérifierons simplement si le nom du client existe déjà dans la base de données ou non. Si elle n'existe pas, nous allons insérer un nouvel enregistrement, sinon nous enverrons un message d'erreur, comme suit:



@RestController
@Component 
@Lazy
class CustomerRegistrar {
 
 CustomerRespository customerRespository;
 Sender sender;
 
 @Autowired
 CustomerRegistrar(CustomerRespository customerRespository, Sender sender){
  this.customerRespository = customerRespository;
  this.sender = sender;
 }
 
 Customer register(Customer customer){
  Optional existingCustomer = customerRespository.findByName(customer.getName());
  if (existingCustomer.isPresent()){
   throw new RuntimeException("is already exists");
  } else {
   customerRespository.save(customer); 
   sender.send(customer.getEmail());
  } 
  return customer;
 }
}

8. Vous pouvez redémarrer votre application Spring boot et tapez l'URL localhost:8080/ dans votre navigateur de choix. cela ouvrira votre votre navigateur HAL
9. Dans votre interface HAL, tapez : http://localhost:8080/customers dans le champs Explorer et observer le resultat dans la section Links comme suit:  





10. Cliquez maintenant sur le premier bouton orange dans la colonne NON-GET intersection self. Cette action vous ouvrira un formulaire pour creer un nouveau client (Customer). Comme suit:


11. Remplissez le formulaire et modifiez le champ action comme indiqué dans le diagramme. Cliquez sur le bouton Make Request. Cela appellera le service de register du controller et enregistrera le client. Essayez de donner un nom déjà existant comme par exemple : Edgar ,edgar@boot.com pour tester si le message d'erreur fonctionne .


12. Attaquons maintenant la dernière partie de l'exemple en intégrant le Customer Notification service (notre deuxième application Spring Boot que vous avez téléchargé) pour informer le client. Lorsque l'inscription est réussie, envoyez un e-mail au client en appelant de façon asynchrone le microservice de notification customer.

13. D'abord mettez à jour CustomerRegistrar.java (si cela n'est pas deja le cas) pour appeler le deuxième microservice. Cela se fait par messagerie (messaging). Dans ce cas, nous avons injecté un composant émetteur (sender) pour envoyer une notification au client en transmettant l'adresse électronique du client à l'expéditeur, comme suit:



@RestController
@Component 
@Lazy
class CustomerRegistrar {
 
 CustomerRespository customerRespository;
 Sender sender;
 
 @Autowired
 CustomerRegistrar(CustomerRespository customerRespository, Sender sender){
  this.customerRespository = customerRespository;
  this.sender = sender;
 }
 
 Customer register(Customer customer){
  Optional existingCustomer = customerRespository.findByName(customer.getName());
  if (existingCustomer.isPresent()){
   throw new RuntimeException("is already exists");
  } else {
   customerRespository.save(customer); 
   sender.send(customer.getEmail());
  } 
  return customer;
 }
}

14. Le composant émetteur(sender) sera basé sur RabbitMQ et AMQP. Dans cet exemple, RabbitMessagingTemplate (org.springframework.amqp.rabbit.core.RabbitMessagingTemplate) est utilisé . Jetez un oeil à ce qui suit:



@Component 
@Lazy
class Sender {
 
 RabbitMessagingTemplate template;
 
 @Autowired
 Sender(RabbitMessagingTemplate template){
  this.template = template;
 }

 @Bean
 Queue queue() {
  return new Queue("CustomerQ", false);
// le serveur RabbitMq surveillera les activites de notre 
// application grace à l'attribut "CustomerQ".  
 }
 
 public void send(String message){
  template.convertAndSend("CustomerQ", message);
 }
}

L'annotation @Lazy est utile car il aide à augmenter le temps de démarrage de l'application boot car, comme vous le savez probablement, lors du démarrage d une application Spring, chaque bean doit etre construit dans le contexte Spring. cela prend du temps Hors avec @Lazy cela ne sera initialisés uniquement lorsque le besoin s'en fait sentir. C-a-d lorsque la classe Sender sera instancie pour faire son job.

15. Nous allons également mettre à jour le fichier application.properties pour inclure les propriétés liées à Rabbit MQ, En effet, RabbitMq que vous avez installe dans votre ordinateur surveillera toutes les activités de votre application grace à l'attribut "CustomerQ" mais via quel canal ? Comment RabbitMq est au courant de votre application qui tourne dans votre ordinateur ? He bien via le port numéro 5672 (port par défaut de rabbitMq) comme suit:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

Ok, nous venons de parcourir le premier module Customer Profile Service de notre microservice.

Cela veut dire que nous sommes désormais capable de créer un Customer et de sauvegarder ses données dans la base de données H2. Ce que nous voulons maintenant c'est de créer un deuxième module Customer Notification service qui aura pour but de notifier le customer que son inscription a bel et bien été complété. Alors la question qu on peut se poser c'est pourquoi faut-il un deuxième module alors qu il suffirait de tout implémenter dans la même application monolithique. He bien c'est cela la même le principe Microserves. Séparer tout ce qui peut être séparé afin de limiter interdépendance entre chaque composantes ou Diviser pour régner.



16. Nous sommes prêts à envoyer le message. Pour consommer le message et envoyer des e-mails, nous allons créer un service de notification. Pour cela, créons un autre microservice Spring Boot, chapitre2.Bootcustomernotification (notre deuxième application Spring Boot que vous avez téléchargé).



17, Ajoutez une classe de Receiver.java. La classe Receiver attend les messages de Customer(Sender). Celui-ci recevra un message envoyé par le Customer Profil service . À l'arrivée d'un message, il enverra un e-mail, comme suit:



@Component
class Receiver {
@Autowired
Mailer mailer;

@Bean
Queue queue() {
return new Queue("CustomerQ", false);
}
 
@RabbitListener(queues = "CustomerQ")
public void processMessage(String email) {
System.out.println(email);
mailer.sendMail(email); 
    }
 
}

18. Ajoutez un autre composant pour envoyer un e-mail au client. Nous utiliserons JavaMailSender (org.springframework.mail.javamail.JavaMailSender) pour envoyer un e-mail via le code suivant:


@Component 
class Mailer {
 
 @Autowired
    private  JavaMailSender  javaMailService;
    
   Mailer( ){
     
   }
 public void sendMail(String email){
 System.err.println(email);
 
        SimpleMailMessage mailMessage=new SimpleMailMessage();
 mailMessage.setTo(email);
 mailMessage.setSubject("Registration");
 mailMessage.setText("Successfully Registered");
 javaMailService.send(mailMessage);
    }
     
}

19. Pour verifier SMTP, une configuration est nécessaire pour vous assurer que les mails sortent bien.
Dans cet exemple, FakeSMTP sera utilisé. Vous pouvez télécharger FakeSMTP depuis https://nilhcem.github.io/FakeSMTP/.
 Une fois que vous avez téléchargé fakeSMTP-2.0.Jar, exécutez le serveur SMTP en exécutant la         commande suivante: java-jar fakeSMTP-2.0.jar ou bien double cliquez sur le fichier jar que             vous avez téléchargé. Cela ouvrira une interface GUI pour monitorer les messages emails.                   Clickez sur le bouton start Server just à cote de la textbox listening port.

20. Mettez à jour application.properties avec les paramètres de configuration suivants pour se                à RabbitMQ ainsi qu'au serveur de messagerie fakeSMTP-2.0:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

spring.mail.host=localhost
spring.mail.port=2525

21. Nous sommes prêts à tester nos microservices de bout en bout. Démarrez les deux applications Spring Boot. Ouvrez le navigateur et répétez les étapes de création du customer (revoir étapes 8,9,10 et 11)via le navigateur HAL. Dans ce cas, immédiatement après la soumission de la demande, nous serons en mesure de voir le courrier électronique dans l'interface graphique fakeSMTP-2.0. À l'interne, le service Profil de client appelle de façon asynchrone le service Notification du client qui, à son tour, envoie le message électronique au serveur SMTP:

Important: La section Listening port doit absolument correspondre avec le port spring.mail.port=2525 indique dans l’étape précédente (20). 


Posted by Achille at 5:04 AM No comments:
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
Labels: Spring Microservices

Sunday, November 27, 2016

Implémentation de Spring Boot messaging avec Rabbit MQ.

Dans un cas idéal, toutes les interactions microservice devraient se produire de manière asynchrone en utilisant la sémantique ou design pattern publish-subscribe (comme twitter oui). A cet effet Spring Boot fournit un mécanisme (sans maux de tête) pour configurer ces solutions de messaging:




Dans cet exemple, nous créerons une application Spring Boot avec un émetteur(Sender) et un récepteur(Receiver), tous deux connectés via une file d'attente externe (RabbitMQ (queue)).
Il s'agit ici d'un exemple "hello world" très basique. le but étant surtout de comprendre le principe et de vérifier si RabbitMq fonctionne correctement sur votre ordinateur. Le plus intéressant est avenir dans mon prochain post ou j’implanterais l'application selon l’architecture Microservices.

Procédez comme suit:

prérequis: Pour cristalliser les concepts microservices, il est supposé que les composants suivants sont installés dans votre ordinateur.

  • JDK 1.8: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
  • Spring Tool Suite 3.7.2 (STS): https://spring.io/tools/sts/all
  • Maven 3.3.1: https://maven.apache.org/download.cgi
Note: l’entièreté du code source est disponible via github: https://github.com/Georges73/springbootRabbitMq
  1. Démarrer STS 
  2. Accédez à File | New | Spring Starter Project. 
  3. Dans la section Name tapez : bootmessaging
  4. Selectionnez AMQP sous I/O






  1. Rabbit MQ sera également nécessaire pour cet exemple. Téléchargez et installez la dernière version de Rabbit MQ ici https://www.rabbitmq.com/download.html et suivez les étapes d'installation documentées sur le site. Une fois prêt, démarrez le serveur RabbitMQ via la commande suivante: $./ rabbitmq-server ou plus simple encore via Windows Services. Vous pouvez également installer une interface web pour accéder RabbitMq  (en anglais): https://cmatskas.com/getting-started-with-rabbitmq-on-windows/
  2. Effectuez les modifications de configuration dans le fichier application.properties de votre application Spring Boot sous src/main/resources pour refléter la configuration de RabbitMQ. La configuration suivante utilise le port, le nom d'utilisateur et le mot de passe par défaut de RabbitMQ:    
    spring.rabbitmq.host=localhost
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=guest
    spring.rabbitmq.password=guest
  3. Ajoutez un composant d'expéditeur de message et une file d'attente nommée TestQ du type org.springframework.amqp.core.Queue au fichier Application.java sous src/main/java. RabbitMessagingTemplate est un moyen pratique d'envoyer des messages. L'avantage de Spring Boot est que ce dernier fournira implicitement toutes les configurations standard pour envoyer des messages. 
  4. @Component 
    class Sender {
     
     RabbitMessagingTemplate template;
    
     @Autowired
     Sender(RabbitMessagingTemplate template){
      this.template = template;
     }
     @Bean
     Queue queue() {
      return new Queue("TestQ", false);
     }
     
     public void send(String message){
      template.convertAndSend("TestQ", message);
     }
    }
    
    4. Pour recevoir le message, tout ce qui doit être utilisé est l'annotation @RabbitListener dans la           class Receiver.java toujours dans la classe Application.java. Spring Boot se chargera du reste. 


      @Component
      class Receiver {
      @RabbitListener(queues = "TestQ")
      public void processMessage(String content) {
       System.out.println(content);
      }
 
      }

    5. La dernière partie de cet exercice est de connecter l'expéditeur (Sender) à notre application principale et d'implémenter la méthode d'exécution de CommandLineRunner pour lancer l'envoi du message. Lorsque l'application est initialisée, elle appelle la méthode run() de CommandLineRunner, comme suit:

     @SpringBootApplication 
     public class Application implements CommandLineRunner{

 @Autowired
 Sender sender;
 
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    
    @Override
    public void run(String... args) throws Exception {
     sender.send("Hello Messaging..!!!");
    }
}

   6. Exécutez l'application en tant qu'application Spring Boot (run as Spring boot app) et vérifiez la           sortie. Le message suivant sera imprimé dans la console:

    Hello Messaging..!!!






Posted by Achille at 7:55 AM No comments:
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest

Saturday, November 19, 2016

Configuration de l'Environnement de développement : Configuration de Java

Évidemment, la première configuration que nous devons faire est Java. Plus connu techniquement parlant sous Java Development Kit (JDK). JDK comprend un compilateur Java (javac), une machine virtuelle java, et une variété d'autres outils pour compiler et exécuter des programmes Java.

Ok, temps de passer l'action - # 1 installation de JDK


Nous allons utiliser Java 8, mais Java 6 ou toute version supérieure est également suffisant. Voyons comment nous pouvons installer JDK sur les systèmes d'exploitation Windows:


    1. Accédez à la page de téléchargement de Java SE sur le site Web Oracle en saisissant l' URL : http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
    2. Cliquez sur le lien de téléchargement de la plateforme Java JDK 8; Cela vous mènera à la licence. D'accord. Acceptez l'accord de licence en sélectionnant cette option dans la radio bouton.
    3. Maintenant, cliquez sur le lien de téléchargement indiqué correspondant à votre système d'exploitation Windows.  Par exemple, si votre système d'exploitation est de type 32 bit, cliquez sur Le lien de téléchargement correspondant à Windows x86. Ou, si votre système d'exploitation est De type 64 bits, cliquez sur le lien de téléchargement correspondant à Windows x64.
    4. Maintenant, va commencer à télécharger l'installateur. Une fois le téléchargement terminé, accédez au programme d'installation. Cela ouvrira la Fenêtre de l'assistant suivant (voir image); Cliquez sur le bouton "next" de l'assistant et cliquez sur le bouton "close" à la fin de l'assistant:
    5. Vous pouvez maintenant voir le répertoire JDK installé dans l'emplacement par défaut; Dans notre cas, C:\Program Files\Java


    Ok, temps de passer à l'action - # 2 Mise en place des variables d'environnement. 

    Après l'installation de JDK, nous devons effectuer une configuration supplémentaire qui nous permettra d'utiliser Java depuis n'importe quel répertoire de notre ordinateur. En configurant les variables d'environnement pour Java dans le système d'exploitation Windows.

    1. Naviguez en direction de  Panneau de configuration (control panel) | Système |  Paramètres système avancés(Advanced system settings) | Variables d’environnement (Environment Variables).
    2. Maintenant cliquez sur "nouvelles" dans la section variables Système (System variables) et entrer "JAVA_HOME" comme nom de variable et "C:\Program Files\Java\jdk1.8" comme Valeur de la variable. Notez que Si vous n'avez pas de droits sur le système d'exploitation, vous ne pourrez pas modifier les variables système; dans ce Cas, vous pouvez créer la variable JAVA_HOME sous le panneau Variables utilisateur.
    3. Maintenant, toujours dans la même section Variables système, double-cliquez sur l'entrée de variable PATH; Une fenêtre Modifier la variable système s'affiche.
    4. Modifier la valeur de la variable du chemin en ajoutant le texte ;% JAVA_HOME%\bin à son emplacement existant. !! Modifiez soigneusement la variable de chemin d'accès; Vous devez seulement ajouter le texte à la fin de la valeur. Ne pas supprimer ou perturber les valeurs existantes; Assurez-vous que vous n'avez pas manqué le ; (Point-virgule) car c'est la première lettre dans le texte que vous allez ajouter (voir Img 3).
    5. Cliquez maintenant sur le bouton OK.

                                              Img 1


                                              Img 2

                                             Img 3

    Maintenant, nous avons installé Java dans notre ordinateur. Pour vérifier si notre installation a été
    correctement configurée, ouvrez une nouvelle fenêtre de commande  cmd et tapez java -version et appuyez sur Entrer; Vous verrez la version installée de Java sur l'écran:

    C:\>java -version
    java version "1.8.0_51"
    Java(TM) SE Runtime Environment (build 1.8.0_51-b13)
    Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)



    Posted by Achille at 1:41 AM No comments:
    Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
    Labels: Java

    Friday, November 18, 2016

    Spring Boot + Spring Security + Servir ressources statiques depuis différents emplacements.

    Naar de inhoud springen





    Avec Spring, nous pouvons configurer des ressources statiques telles que des images, js et des fichiers css à partir d’emplacements spécifiques sous la racine de votre application Web, le classpath et d’autres emplacements. Nous pouvons même configurer plusieurs emplacements differents afin de servir des fichiers de types différents.
    Une implémentation de l’interface WebMvcConfigurer dans la classe abstraite WebMvcConfigurerAdapter avec des méthodes vides permettant aux sous-classes de ne remplacer que les méthodes qui les intéressent. Pour obtenir et servir des ressources statiques à partir de différents emplacements, nous devons étendre (extend) la classe WebMvcConfigurerAdapter et nous devons implémenter(écraser) la méthode @Override addResourceHandlers () qui nous intéresse dans notre classe Application.
    Prenons l’exemple simple pour servir des ressources statiques de types images et des fichiers texte à partir d’emplacements différents.
    Dans cet exemple, nous allons charger des images et des fichiers texte à partir de différents emplacements comme :
    • images depuis C://images
    • text files depuis C://txtfiles
    pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
    
     <groupId>com.app</groupId>
     <artifactId>staticresourceloader</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <packaging>war</packaging>
    
     <name>staticresourceloader</name>
     <description>staticresourceloader project</description>
    
     <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.2.5.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
     </parent>
    
      <dependencies>
      
      <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-security</artifactId>
      </dependency>
      <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-ws</artifactId>
      </dependency>
      
      <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-tomcat</artifactId>
       <scope>provided</scope>
      </dependency>
      <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
      </dependency>
     </dependencies>
     
     <build>
      <plugins>
       <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
       </plugin>
      </plugins>
     </build>
    
    </project>
    
    application.properties
    security.user.password=Efhj34tGVW
    
    staticresourceloader.imageFileLocation.path:file:C:\\images\\
    
    staticresourceloader.txtFileLocation.path:file:C:\\txtfiles\\
    
    Application.java
    package com.app.staticresourceloader;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    
    @ComponentScan
    @EnableAutoConfiguration
    @SpringBootApplication
    public class Application extends WebMvcConfigurerAdapter  {
    
     @Value("${staticresourceloader.imageFileLocation.path}")
        private String staticImageFilePath;
     
     @Value("${staticresourceloader.txtFileLocation.path}")
        private String staticTxtFilePath;
     
     public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
        
     @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/api/image/**").addResourceLocations(staticImageFilePath);
            registry.addResourceHandler("/api/txt/**").addResourceLocations(staticTxtFilePath);
        }    
    }
    
    ServletInitializer.java
    package com.app.staticresourceloader;
    
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.context.web.SpringBootServletInitializer;
    
    public class ServletInitializer extends SpringBootServletInitializer {
    
     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
      return application.sources(Application.class);
     } 
    }
    
    MyController.java
    package com.app.staticresourceloader;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.Collection;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    
    @Controller
    public class MyController {
    
     @Value("${staticresourceloader.imageFileLocation.path}")
        private String staticImageFilePath;
     
     @Value("${staticresourceloader.txtFileLocation.path}")
        private String staticTxtFilePath;
     
     
     @RequestMapping(value="/api/getImageList", method=RequestMethod.GET, headers="Accept=application/json")
     public ResponseEntity<Collection<String>> getImageList(){
      
      Collection<String> fileList = fileList(staticImageFilePath, "image");
      
      return new ResponseEntity<Collection<String>>(fileList, HttpStatus.OK);
     } 
     
    
            @RequestMapping(value="/api/getTxtList", method=RequestMethod.GET, headers="Accept=application/json")
     public ResponseEntity<Collection<String>> getTxtFileList(){
      
      Collection<String> fileList = fileList(staticTxtFilePath, "txt");
      
      return new ResponseEntity<Collection<String>>(fileList, HttpStatus.OK);
     } 
     
    
            public Collection<String> fileList(String folderPath, String type) {
      
      File directory = new File(folderPath.replace("file:", ""));
      File[] fList = directory.listFiles();
      
      Collection<String> list = new ArrayList<String>();
      
      for (File file : fList) {
       
       list.add("http://localhost:8080/api/"+type+"/"+file.getName());
      }  
      return list;
     } 
    }
    
    Spring Boot + Spring Security + Serve static resources from different locations
    OUTPUT:
    Spring Boot + Spring Security + Serve static resources from different locations

    Spring Boot + Spring Security + Serve static resources from different locations

    Spring Boot + Spring Security + Serve static resources from different locations

    Spring Boot + Spring Security + Serve static resources from different locations

    Spring Boot + Spring Security + Serve static resources from different locations




      Posted by Achille at 11:32 PM No comments:
      Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
      Labels: Spring
      Newer Posts Home
      Subscribe to: Posts (Atom)

      About Me

      Achille
      View my complete profile

      Categories

      • Java
      • Spring
      • Spring Microservices

      Blog Archive

      • ▼  2016 (4)
        • ▼  November (4)
          • Développer un exemple de microservice complet
          • Implémentation de Spring Boot messaging avec Rabbi...
          • Configuration de l'Environnement de développement ...
          • Spring Boot + Spring Security + Servir ressources...
      Simple theme. Powered by Blogger.