Nuestro equipo de trabajo ha pasado horas investigando la respuesta a tus interrogantes, te compartimos la resolución de modo que esperamos servirte de mucha apoyo.
Solución:
Si realmente está usando un PARCHE, entonces debe usar RequestMethod.PATCH, no RequestMethod.POST.
Su asignación de parches debe contener la identificación con la que puede recuperar el objeto Manager que se va a parchear. Además, solo debe incluir los campos con los que desea cambiar. En su ejemplo, está enviando la entidad completa, por lo que no puede discernir los campos que realmente están cambiando (vacío significa dejar este campo solo o cambiar su valor a vacío).
¿Quizás una implementación como tal es lo que buscas?
@RequestMapping(value = "/manager/id", method = RequestMethod.PATCH)
public @ResponseBody void saveManager(@PathVariable Long id, @RequestBody Map
Con esto, puedes parchear tus cambios.
1. Autowire `ObjectMapper` in controller;
2. @PatchMapping("/manager/id")
ResponseEntity> saveManager(@RequestBody Map manager)
Manager toBePatchedManager = objectMapper.convertValue(manager, Manager.class);
managerService.patch(toBePatchedManager);
3. Create new method `patch` in `ManagerService`
4. Autowire `NullAwareBeanUtilsBean` in `ManagerService`
5. public void patch(Manager toBePatched)
Optional optionalManager = managerRepository.findOne(toBePatched.getId());
if (optionalManager.isPresent())
Manager fromDb = optionalManager.get();
// bean utils will copy non null values from toBePatched to fromDb manager.
beanUtils.copyProperties(fromDb, toBePatched);
updateManager(fromDb);
Tendrás que extender BeanUtilsBean
para implementar la copia de no null valora el comportamiento.
public class NullAwareBeanUtilsBean extends BeanUtilsBean
@Override
public void copyProperty(Object dest, String name, Object value)
throws IllegalAccessException, InvocationTargetException
if (value == null)
return;
super.copyProperty(dest, name, value);
y finalmente, marque NullAwareBeanUtilsBean como @Component
o
Registrarse NullAwareBeanUtilsBean
como frijol
@Bean
public NullAwareBeanUtilsBean nullAwareBeanUtilsBean()
return new NullAwareBeanUtilsBean();
Tienes la opción de añadir valor a nuestro contenido informacional participando con tu veteranía en las aclaraciones.