update

Service

Usaremos o flatmap! Ele nos permite um merge, transformando uma ou mais streams em uma nova stream.

Antes

@Transactional
public UserDTO update(String id, UserDTO dto) {
    User entity = repository.findById(id)
            .orElseThrow(() -> new ResourceNotFoundException("Recurso não encontrado"));
    copyDtoToEntity(dto, entity);
    entity = repository.save(entity);
    return new UserDTO(entity);
}

Depois

	public Mono<UserDTO> update(String id, UserDTO dto) {
    return repository.findById(id)
            .flatMap(exinstingUser -> {
                //modificamos os dados do User que está no banco
                exinstingUser.setName(dto.getName());
                exinstingUser.setEmail(dto.getEmail());
                return repository.save(exinstingUser);
            })
            //transformamos por fim em um Mono de UserDTO.
            .map(UserDTO::new)
            .switchIfEmpty(Mono.error(new ResourceNotFoundException("Recurso não encontrado")));
}

Controller

Antes

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

Depois

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

Atualizado