Accéder au contenu principal

Articles

Multimplémentation et l'injection de dépendance.

Dans cet article,  nous montrons une approche afin d'avoir un seul endpoint lorsque vous avez différent type de donnée en entrée ou sortie. Cela permet aussi de faire du traitement différent pour chacun des types. Définition des types de données C'est une des nombreuses possibilités de la librairie Jackson qui est montrée ici. @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", include = JsonTypeInfo.As.EXISTING_PROPERTY, visible = true) @JsonSubTypes({     @JsonSubTypes.Type(value =  Square .class, name = "SQUARE"),     @JsonSubTypes.Type(value =  Circle .class, name = "CIRCLE"), }) @Data public abstract class Shape {      public String type ; } @JsonTypeName("SQUARE") @Data public class Square extends Shape {     public double length ; } @JsonTypeName("CIRCLE") @Data public class  Circle  extends Shape {     public double radius ; } Définition des services pour les types de données...

Thymeleaf et htmx

Thymeleaf est un moteur de template serveur régulièrement utilisé le monde Java, principalement avec le framework Spring. Dans cet article, nous présentation quelques architectures possibles avec ce framework ainsi que l'utilisation de Htmx afin de rendre les applications thymeleaf plus dynamiques.    Architecture d'application Voici un ensemble d'architecture varié qu'il est possible de faire avec Thymeleaf     La première étant la plus simple et la plus utilisée dans les exemples montrés sur la toile. J'ai pu expérimenter la cinquième. Le mvc était utilisé pour construire les interfaces utilisateurs, par contre toutes les opérations de suppression, de mise à jour ou de création de données utilisaient une architecture rest. Le javascript était utilisé afin de reloader la page. C'est une solution simple et rapide à mettre en place face à une solution SPA avec Angular, React ou bien Vue. HDA L'augmentation du temps de développement, la complexité des framew...

Spring data jpa et Hibernate’s Warning “firstResult/maxResults specified with collection fetch”

Nous verrons dans cet article comment corrigé le problème  Hibernate’s Warning “firstResult/maxResults specified with collection fetch” qui peut survenir lorsqu'il y a un fetch d'effectuer et qu'il y a du paging. Nous utiliserons spring data jpa. Détail structure Imaginons une relation 1 à plusieurs Lorsqu'on obtient un parent, on désire obtenir aussi sa liste d'enfants. En sql, il y aurait une jointure à effectuer. Il est question d'une recherche avancé où on pourrait recherche par plusieurs critères. Spécification Création d'une spécification pour construire une requête dynamique @Component public class ParentSpecification {     public Specification<Parent> recherche(RechercheParent recherche) {         return (root, cq, cb) -> {             Join<Parent, enfant> enfantJoin;              List<Predicate> rootPredicates = new ArrayList<>();       ...

Logitech Brio 500, zoom sous linux

 Logitech Brio 500 Vous avez une caméra logitech Brio 500 et vous trouvez que vous êtes éloignez ans l'image dans les logitiels de messageries. Il est possible d'améliorer cela  Lister les périphériques v4l2-ctl --list-devices Brio 500 (usb-0000:00:14.0-4):        /dev/video0        /dev/video1        /dev/media0 Lister les fonctionnalités du périphériques v4l2-ctl -d /dev/video0 --list-ctrls User Controls                     brightness 0x00980900 (int)    : min=0 max=255 step=1 default=128 value=129                       contrast 0x00980901 (int)    : min=0 max=255 step=1 default=128 value=128       ...

Multiple fetch dans une requête avec jpa

Hibernate et fort probablement les autres ORM sont limité dans la capacité de ramener tout une structure d'object imbriqué. @Entity private class Student{       @Id     private Long studentId;      private String firstname;     private String lastname;       @OneToMany( mappedBy = "student")     private List<Course> courses     @OneToMany( mappedBy = "student")     private List<Book> books } MultipleBagFetchException Si vous tentez de lancer cette requête provenant d'un repository   @Query("""   select s    from Student s    join fetch s.courses   join fetch s.books """)  List<Student> findStudentWithCoursesBooks(); vous obtiendrez une errreur de type MultipleBagFetchException. Il n'est pas possible de fetcher plus qu'une entité qui va généré un produit cartésien. Il pourrait être possible d'éviter cette e...

Conception d'api REST

 Il y a une multitude de question quand nous commencons à convevoir un API rest. Un débat qui reviens souvent est les ressources imbriqués, parent / enfant, sous-ressource. Hierachie Pourquoi opter pour /parents/{idParent}/enfants/{idEnfant} au lieu de  /enfants/{idEnfant}   La première approche peut être préférable si on veut montrer le lien hierarchique qui unit les ressources. Il faut cependant ne pas exagérer du niveau hierachique, car l'url peut rapidement devenir très long et rendre le tout moins lisible. Il est d'ailleurs rare de voir un api avec plus de 2 niveau. Dans le deuxième cas, pour une sauvegarde, il faudrait que la ressource est le nom du parent. Une autre approche serait /parents/{idParent}?enfants={idEnfant}   Doublon   Rien n'empêche d'utilisé plusieurs approches, dans ce cas, on pourrait se retrouver dans le cas qu'il y a différent endpoint pour obtenir la même ressource.   Longueur des url /companies/{idCompany}/departments/{idDepartm...

Versionnement de son api rest

 Vous avez un ensemble d'api qui est utilisé par de multiple clients. De nouvelle fonctionnalités prévue vont changer les valeurs de retour et les paramètres de certaines méthode. Afin de ne pas casser l'existant, il est possible de mettre en place plusieurs versions des apis. Nous verrons différentes approche pour mettre en place le versionnement d'un api. Versionnement des entités, payload Dans la première mise en place d'un api vous avez une entité  Person Si vous devez ajouter un nouveau champs dans cette entité, l'ancienne pourrait être renommé PersonV1 et la nouvelle PersonV2. PersonV2 ayan un champ prenom Versionnement des url @RestController public class PersonController { @GetMapping("v1/person") public PersonV1 personV1() { return new PersonV1 ("Collin"); } @GetMapping("v2/ person ") public PersonV2 personV2 () { return new PersonV2 ("Collin", "Marc"); } }     Versionnement par un Req...