Saltar al contenido

Actualización parcial de Spring REST con el método @PATCH

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 fields) 
    Manager manager = someServiceToLoadManager(id);
    // Map key is field name, v is value
    fields.forEach((k, v) -> 
       // use reflection to get field k on manager and set it to value v
        Field field = ReflectionUtils.findField(Manager.class, k);
        field.setAccessible(true);
        ReflectionUtils.setField(field, manager, v);
    );
    managerService.saveManager(manager);

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *