Spring Partial Update Object Data Binding

We are using @ModelAttribute to achive what you want to do.

  • Create a method annotated with@modelattribute which loads a user based on a pathvariable throguh a repository.

  • create a method @Requestmapping with a param @modelattribute

The point here is that the @modelattribute method is the initializer for the model. Then spring merges the request with this model since we declare it in the @requestmapping method.

This gives you partial update functionality.

Some , or even alot? ;) would argue that this is bad practice anyway since we use our DAOs directly in the controller and do not do this merge in a dedicated service layer. But currently we did not ran into issues because of this aproach.


I build an API that merge view objects with entities before call persiste or merge or update.

It's a first version but I think It's a start.

Just use the annotation UIAttribute in your POJO`S fields then use:

MergerProcessor.merge(pojoUi, pojoDb);

It works with native Attributes and Collection.

git: https://github.com/nfrpaiva/ui-merge


I've just run into this same problem. My current solution looks like this. I haven't done much testing yet, but upon initial inspection it looks to be working fairly well.

@Autowired ObjectMapper objectMapper;
@Autowired UserRepository userRepository;

@RequestMapping(value = "/{id}", method = RequestMethod.POST )
public @ResponseBody ResponseEntity<User> update(@PathVariable Long id, HttpServletRequest request) throws IOException
{
    User user = userRepository.findOne(id);
    User updatedUser = objectMapper.readerForUpdating(user).readValue(request.getReader());
    userRepository.saveAndFlush(updatedUser);
    return new ResponseEntity<>(updatedUser, HttpStatus.ACCEPTED);
}

The ObjectMapper is a bean of type org.codehaus.jackson.map.ObjectMapper.

Hope this helps someone,

Edit:

Have run into issues with child objects. If a child object receives a property to partially update it will create a fresh object, update that property, and set it. This erases all the other properties on that object. I'll update if I come across a clean solution.