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

Método atualizar no Spring Boot - Rest

No curso o método abaixo atualiza o tópico:

@PutMapping("/{id}")
    @Transactional
    @CacheEvict(value = "listaDeTopicos", allEntries = true)
    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();
    }
package br.com.alura.forum.controller.form;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length;
import br.com.alura.forum.modelo.Topico;
import br.com.alura.forum.repository.TopicoRepository;

public class AtualizacaoTopicoForm {

    @NotNull @NotEmpty @Length(min = 5)
    private String titulo;

    @NotNull @NotEmpty @Length(min = 10)
    private String mensagem;

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

Mas como faço para atualizar apenas um campo do Objeto? Desse jeito só atualiza se eu passar todos os campos do objeto no JSON.

Por exemplo, se eu quiser somente atualizar a mensagem sem mandar o título:

{
    "mensagem":"teste"
}
4 respostas

Oi Matias,

Aí entra a vantagem de se utilizar DTOs, pois você consegue ter uma boa flexibilidade no código.

O ideal é criar outro DTO que contenha apenas o campo que você quer atualizar:

public class AtualizacaoMensagemDoTopicoForm {

    @NotNull @NotEmpty @Length(min = 10)
    private String mensagem;

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

Bons estudos!

solução!

Certo, mas se o sistema tem vários campos na tabela, que podem ser atualizados, essa solução de um DTO para cada campo fica estranho.

Uma solução que encontrei foi testar (AtualizacaoTopicoForm) cada campo se está nulo do json, assim não lança exceção e posso tratar melhor cada campo comparando com os dados que vem da tabela do banco de dados.

Ah sim, a solução que eu citei é no caso de ser uma regra do sistema permitir apenas um ou alguns campos para serem atualizados. Pois assim o DTO teria apenas os atributos que de fato podem ser atualizados.

No seu caso é mais uma questão de ter campos opcionais, então o DTO pode ter todos os atributos e você pode comparar quais estão null, conforme você mencionou.

Bons estudos!

Sim, Rodrigo. Entendi. vlw