Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Como o registro está sendo atualizado no banco?

Minha dúvida é em relação a requisição PUT do TopicosController

// atualiza a cache
    @CacheEvict(value = "listaDeTopicos", allEntries = true)
    // update
    @PutMapping("/{id}")
    // @Transactional avisa ao Spring para commitar a transação no final do método
    @Transactional
    // O método PUT sobrescreve o recurso inteiro(atualiza todas as infos)
    // já o PACTH faz a atualização de alguns campos do recurso
    public ResponseEntity<TopicoDTO> atualizar(@PathVariable Long id, @RequestBody @Valid AtualizacaoTopicoForm form) {

        Optional<Topico> optional = topicoRepository.findById(id);

        if (optional.isPresent()) {
            Topico topico = form.atualizar(id, topicoRepository);
            return ResponseEntity.ok(new TopicoDTO(topico));
        }

        return ResponseEntity.notFound().build();

    }

Por que não está sendo usado o método topicoRepository.save(topico); para salvar as alterações como foi na requisição POST? Sei que é chamado o método atualizar() do atualizacaotopicoForm

    public Topico atualizar(Long id, TopicoRepository topicoRepository) {
        Topico topico = topicoRepository.getOne(id);
        topico.setTitulo(this.titulo);
        topico.setMensagem(this.mensagem);
        return topico;
    }

Mas esse método também não possui o topicoRepository.save(topico); Então como as infos estão sendo salvas no banco somente desse forma?

2 respostas
solução!

Olá, boa noite! Nós usamos o método POST quando vamos enviar alguma coisa para o servidor, quando eu enviar essa resposta para o seu tópico, por exemplo, vou estar fazendo uma requisição do tipo POST. Então quando vamos enviar um formulário de login, cadastro ou outra coisa do tipo, estamos fazendo um POST. Agora, quando queremos alterar alguma coisa, nós podemos usar os métodos PUT ou PATCH, a diferença é que o PUT altera todos os atributos e o PATCH só parte deles. No caso, não precisa do topicoRepository.save(topico) porque o Spring já salva automaticamente por conta da anotação @Transactional :

    @CacheEvict(value = "listaDeTopicos", allEntries = true)
    @PutMapping("/{id}")
    @Transactional // Essa anotação faz com que o Spring faça alterações no banco de dados de forma automática, 
                                // como no método POST você vai criar um registro que ainda não existe, é necessário usar o método save().

    public ResponseEntity<TopicoDTO> atualizar(@PathVariable Long id, @RequestBody @Valid AtualizacaoTopicoForm form) {

        Optional<Topico> optional = topicoRepository.findById(id);

        if (optional.isPresent()) {

            Topico topico = form.atualizar(id, topicoRepository); 
                    // O método atualizar faz alterações no tópico, encontrando ele no topicoRepository e então
                    // chamando os métodos setters. O Spring detecta essas alterações e por conta da @Transactional, salva automaticamente no banco.


            return ResponseEntity.ok(new TopicoDTO(topico));
        }

        return ResponseEntity.notFound().build();

    }

Resumindo, nesse caso como você está fazendo somente alterações, não é necessário usar o método save(), mas ainda assim você pode usar ele sem nenhum problema:

    @CacheEvict(value = "listaDeTopicos", allEntries = true)
    @PutMapping("/{id}")
    @Transactional
    public ResponseEntity<TopicoDTO> atualizar(@PathVariable Long id, @RequestBody @Valid AtualizacaoTopicoForm form) {

        Optional<Topico> optional = topicoRepository.findById(id);

        if (optional.isPresent()) {
            Topico topico = form.atualizar(id, topicoRepository);
            topicoRepository.save(topico);

            return ResponseEntity.ok(new TopicoDTO(topico));
        }

        return ResponseEntity.notFound().build();

    }

Espero ter ajudado!

Ajudou muito, valeu Breno!