Biblioteca de actualizaci贸n parcial. Actualizaci贸n de entidad parcial en Java Web Services

Introducci贸n

La estructura de un conjunto b谩sico de operaciones de servicios web t铆pico en instancias de entidades (objetos) es CRUD ( C reate, R ead, U pdate y D elete). Los m茅todos HTTP POST, GET, PUT y DELETE corresponden a estas operaciones en REST. Pero a menudo el desarrollador necesita cambiar parcialmente el objeto correspondiente al m茅todo HTTP PATCH. Su significado es cambiar en el lado del servidor solo aquellos campos del objeto que se pasaron en la solicitud. Hay varias razones para esto:





  • una gran cantidad de campos en esencia;





  • una alta probabilidad de cambio simult谩neo del mismo objeto bajo una carga alta, como resultado de lo cual no solo se sobrescribir谩n los campos modificados;





  • imposibilidad o mayor complejidad de cambiar campos en varios o todos los objetos del almacenamiento (actualizaci贸n masiva);





Estas y, posiblemente, otras razones inducen al desarrollador a implementar una pila de operaciones para la modificaci贸n parcial del objeto.





Consideremos las opciones m谩s utilizadas para resolver el problema de actualizaci贸n parcial.





Usando un controlador regular y DTO

Una de las implementaciones del m茅todo PATCH m谩s comunes. En el controlador, el objeto entrante se deserializa en un DTO normal y, m谩s adelante en la pila de capas de aplicaci贸n, se considera que no se pueden procesar todos los campos del DTO con un valor nulo.





Las ventajas de este m茅todo incluyen la "familiaridad" de la implementaci贸n.





- 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 ;





.





El formato de este art铆culo no nos permite mirar m谩s de cerca la infraestructura para crear mapeadores y mostrar el uso de la biblioteca en una pila de aplicaciones t铆pica. En el futuro, puedo analizar el ejemplo de actualizaci贸n parcial con m谩s detalle y prestar m谩s atenci贸n a la descripci贸n de la implementaci贸n interna de la biblioteca.








All Articles