Update

O ID passado na requisição postman, foi um ID tirado do MongoDB compass.

Controller

@PutMapping(value = "/{id}")
public ResponseEntity<UserDTO> update(@PathVariable String id, @RequestBody UserDTO dto) {
    dto = userService.update(id, dto);
    return ResponseEntity.ok().body(dto);
}

Service

Criamos aqui um método private dentro do service só para reaproveitar a localização de um User por id:

private User getEntityById(String id) {
    Optional<User> user = userRepository.findById(id);
    return user.orElseThrow(() -> new ResourceNotFound("Objeto não encontrado."));
}
public UserDTO update(String id, UserDTO dto) {
    try {
        User entity = getEntityById(id);
        copyDtoToEntity(dto, entity);
        entity = userRepository.save(entity);
        return new UserDTO(entity);
    } catch (EntityNotFoundException e) {
        throw new ResourceNotFound("Recurso não encontrado");
    }
}

Atualizado