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

problema na validação e no retorno do Json

Professor meu retorno na validação esta como se fosse sem tratamento. Gostaria de uma ajuda. retorno do console esta estrando vou te enviar também. Estou usando o Postman.

package br.com.alura.springBoot.forum.controlle.form;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.Length;

import br.com.alura.springBoot.forum.modelo.Curso;
import br.com.alura.springBoot.forum.modelo.Topico;
import br.com.alura.springBoot.forum.repository.CursoRepository;

public class TopicoForm {
    @NotNull @NotEmpty @Length(min = 5)
    private String titulo;

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

    @NotNull @NotEmpty @Length(min= 3)
    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 String getNomeCurso() {
        return nomeCurso;
    }
    public void setNomeCurso(String nomeCurso) {
        this.nomeCurso = nomeCurso;
    }

    public Topico converter(CursoRepository cursoRepository) {

        Curso curso = cursoRepository.findByNome(nomeCurso);

        return new Topico(titulo,mensagem,curso);
    }


}

package br.com.alura.forum.conf.Validacao;

public class ErroDeFormularioDto {

private String campo; 
private String erro;
public ErroDeFormularioDto(String campo, String erro) {
    this.campo = campo;
    this.erro = erro;
}

public String getCampo() {
    return campo;
}

public String getErro() {
    return erro;
}

}

package br.com.alura.forum.conf.Validacao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

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.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class ErroDeValidacaoHandler {

    @Autowired
    private MessageSource messageSource;

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

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

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

        for(FieldError fieldError : fieldErrors) {

            String mensagem = messageSource.getMessage(fieldError, LocaleContextHolder.getLocale());
            ErroDeFormularioDto erro = new ErroDeFormularioDto(fieldError.getField(), mensagem); 
            dto.add(erro);
        }
        return dto;

    }
}

package br.com.alura.springBoot.forum.controlle;

import java.net.URI; import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.UriComponentsBuilder;

import br.com.alura.springBoot.forum.controlle.dto.TopicoDTO; import br.com.alura.springBoot.forum.controlle.form.TopicoForm; import br.com.alura.springBoot.forum.modelo.Topico; import br.com.alura.springBoot.forum.repository.CursoRepository; import br.com.alura.springBoot.forum.repository.TopicoRepository;

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

@Autowired
private TopicoRepository topicoRepository;

@Autowired
private CursoRepository cursoRepository;

@GetMapping
public List<TopicoDTO> lista(String nomeCurso){ 

    if(nomeCurso==null) {
        List<Topico> topicos = topicoRepository.findAll();
        return TopicoDTO.converte(topicos);
    } else {
        List<Topico> topicos = topicoRepository.findByCursoNome(nomeCurso);
9 respostas

essa e saída do console.

2019-07-02 19:51:09.278 WARN 12580 --- [nio-8082-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.springframework.http.ResponseEntity<br.com.alura.springBoot.forum.controlle.dto.TopicoDTO> br.com.alura.springBoot.forum.controlle.TopicoController.cadastrar(br.com.alura.springBoot.forum.controlle.form.TopicoForm,org.springframework.web.util.UriComponentsBuilder) with 2 errors: [Field error in object 'topicoForm' on field 'titulo': rejected value []; codes [Length.topicoForm.titulo,Length.titulo,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [topicoForm.titulo,titulo]; arguments []; default message [titulo],2147483647,5]; default message [tamanho deve estar entre 5 e 2147483647]] [Field error in object 'topicoForm' on field 'titulo': rejected value []; codes [NotEmpty.topicoForm.titulo,NotEmpty.titulo,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [topicoForm.titulo,titulo]; arguments []; default message [titulo]]; default message [não pode estar vazio]] ]

saida do postman que era pra esta tratado o retorno da validação. { "timestamp": "2019-07-02T22:51:09.280+0000", "status": 400, "error": "Bad Request", "errors": [ { "codes": [ "Length.topicoForm.titulo", "Length.titulo", "Length.java.lang.String", "Length" ], "arguments": [ { "codes": [ "topicoForm.titulo", "titulo" ], "arguments": null, "defaultMessage": "titulo", "code": "titulo" }, 2147483647, 5 ], "defaultMessage": "tamanho deve estar entre 5 e 2147483647", "objectName": "topicoForm", "field": "titulo", "rejectedValue": "", "bindingFailure": false, "code": "Length" }, { "codes": [ "NotEmpty.topicoForm.titulo", "NotEmpty.titulo", "NotEmpty.java.lang.String", "NotEmpty" ], "arguments": [ { "codes": [ "topicoForm.titulo", "titulo" ], "arguments": null, "defaultMessage": "titulo", "code": "titulo" } ], "defaultMessage": "não pode estar vazio", "objectName": "topicoForm", "field": "titulo", "rejectedValue": "", "bindingFailure": false, "code": "NotEmpty" } ], "message": "Validation failed for object='topicoForm'. Error count: 2",

Oi Marcos,

Estranho não ter funcionado, pois o seu código está correto.

Você está com o módulo DevTools adicionado no projeto?

Talvez após fazer essa mudança ele não tenha conseguido reiniciar o servidor com as mudanças automaticamente.

estou usando sim devTools. Mas se fosse isso quando eu reiniciasse o servidor ele pegaria a alteração ne. E te falar quando mando requisição pelo Postman aparece na saida um link"Resolved [org.springframework.web.bind.MethodArgumentNotValidException:" que quando clico abri uma caixa do eclipse. Não sei se preciso confirmar alguma coisa nessa caixa ou configurar...

Oi Marcos,

Pois é, estranho não ter funcionado então, pois está tudo ok.

Consegue disponibilizar seu projeto para eu dar uma analisada?

Pode ser no GitHub, ou zipado e adicionado do Google Drive, Dropbox, etc.

Consigo sim GitHub

https://github.com/marcosparreira10/forum.git

solução!

Oi Marcos,

Vi aqui o seu proejto.

O problema é que as suas classes ErroDeFormularioDto e ErroDeValidacaoHandler estão em um pacote separado do pacote principal do projeto.

O Spring Boot somente consegue enxergar as classes que estão no mesmo pacote da classe Main ou nos seus subpacotes.

Mova essas 2 classes para dentro do pacote springBoot.forum, que é o seu pacote onde está a classe Main(ForumApplication), que resolverá.

Bons estudos!

muito obrigado pela rapidez na solução. Esta de parabéns pelo curso, estou aprendendo muito aqui. vlw.

funcionou perfeitamente. vlw