2
respostas

Tratamento de erros retorna null

 {
        "campo": null,
        "erro": null
    },
    {
        "campo": null,
        "erro": null
    }
package br.com.eliza.forumalura.config.validation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

@RestControllerAdvice
public class ErroDeValidacaoHandler {

    @Autowired
    private MessageSource messageSouce;

    @ResponseStatus (code = HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public List<ErroFormularioDto> handle(MethodArgumentNotValidException exception){

        List<ErroFormularioDto> dto = new ArrayList<>();

        List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors();

        for (FieldError e : fieldErrors) {
            String mensagem = messageSouce.getMessage(e, LocaleContextHolder.getLocale());
            ErroFormularioDto erro = new ErroFormularioDto(e.getField(), mensagem);
            dto.add(erro);
        }
        return dto;

    }
}
package br.com.eliza.forumalura.controller;

import br.com.eliza.forumalura.controller.dto.response.TopicoDto;
import br.com.eliza.forumalura.controller.dto.request.TopicoForm;
import br.com.eliza.forumalura.model.Topico;
import br.com.eliza.forumalura.repository.CursoRepository;
import br.com.eliza.forumalura.services.TopicoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.UriComponentsBuilder;

import javax.validation.Valid;
import java.net.URI;
import java.util.List;

@RestController
@RequestMapping (value = "/topicos")
public class TopicoController {

    @Autowired
    private TopicoService topicoService;

    @Autowired
    private CursoRepository cursoRepository;

    @GetMapping
    public List<TopicoDto> lista(String nomeCurso){
        if (nomeCurso == null) {
            List<Topico> topicos = topicoService.findAll();
            return TopicoDto.converter(topicos);
        }
        else {
            List<Topico> topicos = topicoService.findByCurso_Nome(nomeCurso);
            return TopicoDto.converter(topicos);
        }
    }

    /*código 201(created) devemos devolver a URI do recurso que acabou de ser criado.
    ex.: URI endereco = new URI("http://localhost:8080/topicos");
    Para evitar passar o endereço completo da URI (pois pode mudar futuramente), utilizamos
    a classe URIBuilder, que já pega automaticamente o endereço do servidor
    e só precisa passar o final da URI.
    ex.: URI endereco = uriBuilder.path("/topicos").toUri();*/

    @PostMapping
    public ResponseEntity <TopicoDto> cadastrar (@RequestBody @Valid TopicoForm topicoForm, UriComponentsBuilder uriBuilder){
       Topico topico = topicoForm.converter(cursoRepository);
       topicoService.save(topico);
       URI uri = uriBuilder.path("topicos/{id}").buildAndExpand(topico.getId()).toUri();
       return ResponseEntity.created(uri).body(new TopicoDto(topico));

    }


package br.com.eliza.forumalura.controller.dto.request;

import br.com.eliza.forumalura.model.Curso;
import br.com.eliza.forumalura.model.Topico;
import br.com.eliza.forumalura.repository.CursoRepository;
import com.sun.istack.NotNull;
import org.hibernate.validator.constraints.Length;
import org.springframework.lang.NonNull;

import javax.validation.constraints.NotEmpty;

public class TopicoForm {

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

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public void setNomeCurso(String nomeCurso) {
        this.nomeCurso = nomeCurso;
    }

    public String getNomeCurso() {
        return nomeCurso;
    }

    public Topico converter(CursoRepository cursoRepository) {
        Curso curso = cursoRepository.findByNome(nomeCurso);
        return new Topico(titulo, mensagem, curso);
    }

}

`

2 respostas

Já foi resolvido!

Baixei o projeto do curso dessa aula e percebi que tinha algumas coisas incompletas!

Perfeito Rodrigo, qualquer coisa volte a postar :)