Bibliothèque de mise à jour partielle. Mise à jour partielle des entités dans les services Web Java

introduction

La structure d'un service Web typiques des opérations de jeu de base sur les instances d'entités (objets) est CLMS ( C réer, R ead, U pdate et D elete). Les méthodes HTTP POST, GET, PUT et DELETE correspondent à ces opérations dans REST. Mais souvent, le développeur doit modifier partiellement l'objet correspondant à la méthode HTTP PATCH. Sa signification est de ne changer côté serveur que les champs de l'objet qui ont été passés dans la requête. Il y a plusieurs raisons à cela:





  • un grand nombre de domaines en substance;





  • probabilité élevée de changement simultané du même objet sous une charge élevée, à la suite de quoi non seulement les champs modifiés seront écrasés;





  • impossibilité ou complexité plus élevée de modifier les champs dans plusieurs ou tous les objets du stockage (mise à jour en masse);





Ces raisons et, éventuellement, d'autres incitent le développeur à implémenter une pile d'opérations pour la modification partielle des objets.





Considérons les options les plus fréquemment utilisées pour résoudre le problème de mise à jour partielle.





Utilisation d'un contrôleur régulier et d'un DTO

L'une des implémentations de méthode PATCH les plus courantes. Dans le contrôleur, l'objet entrant est désérialisé en un DTO normal, et plus loin dans la pile de couches d'application, il est considéré que tous les champs du DTO avec une valeur nulle ne peuvent pas être traités.





Les avantages de cette méthode incluent la "familiarité" de la mise en œuvre.





- null



( null



).





DTO . , . ObjectMapper



(/ POJO, @JsonInclude(Include.NON_NULL) ) , MapStruct, .





Map<String, Object> POJO

Map<String, Object>



. JSON . , , ( IDE).





null



.





: , , , , runtime( ).





JSON Patch JSON Merge Patch

JSON Patch JSON Merge Patch . Java EE , : JsonPatch JsonMergePatch. , json-patch. Michael Scharhag REST: Partial updates with PATCH.





: , , , , , , .





, DTO , , , , etc.





Partial Update library

: DTO Map<String, Object>



" ".





ChangeLogger ChangeLoggerProducer.





ChangeLoggerProducer



"" POJO, ChangeLogger



, Map<String, Object>



.





POJO:





public class UserModel {
	private String login;
	private String firstName;
	private String lastName;
	private String birthDate;
	private String email;
	private String phoneNumber;
}

@ChangeLogger
public class UserDto extends UserModel {
}
      
      



"":





ChangeLoggerProducer<UserDto> producer = new ChangeLoggerProducer<>(UserDto.class);
UserDto user = producer.produceEntity();
user.setLogin("userlogin");
user.setPhoneNumber("+123(45)678-90-12");
Map<String, Object> changeLog = ((ChangeLogger) user).changelog();
/*
    changeLog in JSON notation will contains:
    {
        "login": "userlogin",
        "phoneNumber": "+123(45)678-90-12"
    }
*/
      
      



"" : Set<String>



, Map<String, Object> changelog()



, , , . , , ChangeLogger



, Map<String, Object> changelog()



.





/ "" ChangeLoggerAnnotationIntrospector



. Annotation Introspector ObjectMapper



. "" , @ChangeLogger



Map<String, Object> changelog()



. ObjectMapper



ChangeLoggerAnnotationIntrospector



.





:





ObjectMapper mapper = new ObjectMapper.setAnnotationIntrospector(new ChangeLoggerAnnotationIntrospector());
ChangeLoggerProducer<UserDto> producer = new ChangeLoggerProducer<>(UserDto.class);
UserDto user = producer.produceEntity();
user.setLogin("userlogin");
user.setPhoneNumber("+123(45)678-90-12");
String result = mapper.writeValueAsString(user);
/*
    result should be equal
    "{\"login\": \"userlogin\",\"phoneNumber\": \"+123(45)678-90-12\"}"
*/
      
      



:





ObjectMapper mapper = new ObjectMapper.setAnnotationIntrospector(new ChangeLoggerAnnotationIntrospector());
String source = "{\"login\": \"userlogin\",\"phoneNumber\": \"+123(45)678-90-12\"}";
UserDto user = mapper.readValue(source, UserDto.class);
Map<String, Object> changeLog = ((ChangeLogger) user).changelog();
/*
    changeLog in JSON notation will contains:
    {
        "login": "userlogin",
        "phoneNumber": "+123(45)678-90-12"
    }
*/
      
      



ObjectMapper



ChangeLoggerAnnotationIntrospector



JSON . DTO, Model, Entity "". Partial Update Example.





Partial Update library , . , runtime.





:





  • " ", DTO, Model, Entity;





  • Spring, / "" DTO ( ), ChangeLoggerAnnotationIntrospector



    ObjectMapper



    ;





  • SQL/HQL bulk update ;





.





Le format de cet article ne nous permet pas d'examiner de plus près l'infrastructure de création de mappeurs et de montrer l'utilisation de la bibliothèque dans une pile d'applications typique. À l'avenir, je peux analyser l' exemple de mise à jour partielle plus en détail et accorder plus d'attention à la description de l'implémentation interne de la bibliothèque.








All Articles