Accéder au contenu principal

Articles

Architecture hexagonale

Introduction Dans une application conventionnel, il ne sera pas rare d'avoir une couche de contrôleur,  de service et de dao. Pour chacune de nos entités, une classe existera sous chacune de ces couches. Il est possible de se retrouver rapidement avec des centaines de classes. Ce type d'architecture utilise un modèle d'objet anémique, c'est-à-dire qu'il ne contient pas de logique métier. Il n'est pas rare de voir un appel à la couche de persistance directement de la première couche. Les entités, les domains object n'ont pas de règle métier. Elle est alors mise dans les classes de service, utilitaire. Ces classes chargent des entités, modifient leurs états et persistent le tout. Les services commencent à utiliser d'autres services et il n'est pas rare de se retrouver avec des classes de plusieurs milliers de lignes. Pour une petite application, de type CRUD, ça peut être plus rapide à développer, mais imaginer maintenant une application avec 200K, 300...

Comment mapper des objets avec MapStruct

Il n'est pas rare dans une application de devoir copier les valeurs d'un type d'objet à un autre. Par exemple les objets de la couche métier à ceux de la présentation. Une multitude de librairie existe en Java pour effectuer cette opération. Dans cet article nous utiliserons un des plus rapides soit MapStruct. Une comparaison est disponible à cette url . Mappage avec les mêmes noms de champs public class Person{     private String name;     private String lastname;     private int age; } public class PersonDto{     private String name;     private String lastname; } Il suffit de créer une interface @Mapper public interface PersonMapper {     PersonDto personToPersonDTO(Person entity);     Person epersonDTOtoPerson(PersonDto dto); } MapStruct générera une classe d'implémentation. Ne surtout pas hésiter à la regarder pour voir le code généré pour éviter des surprises. Mappag...

Générer un rapport grâce à Thymeleaf et Open HTML to PDF

Une multitude de produit existe pour générer des rapports dans différents formats. Jaspert Report, iText. Certain sont plus bas niveau tel que PDFbox. Le moteur de template Thymeleaf permet de générer des pages web. Ensuite il est possible d'utiliser une librarie tierce tel que Open Html To pdf pour générer un pdf. C'est la manière la plus simple et rapide que j'ai trouvé pour générer un pdf. Spring boot sera utilisé, par défaut lorsqu'il est utilisé avec Thymeleaf, une configuration est généré afin de pouvoir généré des pages web. Une autre configuration doit être créé pour être indépendant de celle-ci. @Component public class PdfGeneratorUtil<T> {     @Autowired     private TemplateEngine templateEngine;     public byte[] process(String templateName, String templateExtension, List<T> listT, String contextVariableName) throws Exception {         Context ctx = new Context(); ...

Chargement d'un fragment Thymeleaf en Ajax

Même si le moteur de template Thymeleaf est exécuté du côté serveur, il est possible de charger un fragment à la suite d'un évènement. En utilisant cette façon de procéder, on peut se rapproche de l'expérience utilisation d'une applicate dite SPA. Chargement dynamique d'un fragment L'application ressemble à ceci. En cliquant sur Obtenir un fragment ajax, un appel sera fait sur le serveur et un fragment sera retourné. Il faut avoir une section dans notre template pour insérer le fragment. Dans notre page, nous avons une section avec l'id main <div id="main" class="container-fluid"> </div>   Le fragment sera inséré à cet endroit après un appel sur le serveur.  var XHR = new XMLHttpRequest();  XHR.open('get', '/ajaxfragment');  XHR.send();  XHR.addEventListener('readystatechange', function() {      if (XHR.readyState === XMLHttpRequest.DONE && XHR.status === 200) {          documen...

Les formulaires avec thymeleaf

Dans un précédent tutoriel, le moteur de thymeleaf a été présenté rapidement. Nous allons ici présenté comment utiliser un formulaire avec ce moteur de template. Nous verrons deux façon d'appréhender les formulaires. La sauvegarde est complètement différentes. Le formulaire est utilisé pour la sauvegarde d'un utilisateur. Le modèle est public class User {     private String firstname;     private String lastname;     private boolean enabled;         private String userTypeId;     ... } public class UserType {     private Long id;     private String type;     ... } Le code pour afficher le formulaire est @GetMapping(value = {"/userform"})     public String getUserForm(Model model) {         List<UserType> userTypes = new ArrayList<>();       ...

Débuter rapidement avec Thymeleaf

Débuter rapidement avec Thymeleaf Thymeleaf est un moteur de template côté serveur. Tel que JSP, JSF, les pages sont généré sur le serveur. Ce moteur est entièrement supporté par Spring Boot.  Il est majoritairement utilisé dans des applications, mais il peut être utilisé dans la construction de page pdf ou bien de courriel. Thymeleaf utilise des pages html auquel des marqueurs (commande) sont ajouté pour aider le moteur à faire certain traitement. Les exemples utilisés sont basé sur un projet en spring boot 2.2 public class User {  private String firstname;  public User(){       public String getFirstname() {          return firstname ;      }      public void setFirstname(String firstname) {          this . firstname = firstname;      } } @Controller public class UserControl...

Types de paramètres pour un contrôleur

Types de paramètres pour un contrôleur Les exemples utilisent spring boot 2. Nous allons voir comment effectuer une sauvegarde de donnée à l'aide de Spring. Nous allons aborder l'approche avec un modeleAttribute et un RequestBody Avec un requestBody Tous les paramètres passent en JSon ou xml. Il est préférable d'employé un request body lors d'un envoi en ajax, même s'il est possible de le faire avec un modelAttribute. Côté Client $("#colorsForm").submit(function (e) {     e.preventDefault();     var colorsId= $('#colorsForm input[name="id"]').val();     var form = transForm.serialize('#colorsForm');     form = JSON.stringify(form);     $.ajax({         type: "post",         url: "/template/edit/colors/" + colorsId,         data: form,         contentType: "app...