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

Javax Validation, @Valid. Não estou recebendo status 400 ao tentar criar um topico sem titulo

Olá.

Estou na aula 5, tentando inserir a validação e a validação não está funcionando. Estou enviando uma requisição POST para "/topicos" com esse corpo:

{
    "titulo":"",
    "mensagem":"",
    "nomeCurso":"Sprint Boot"
}

E estou recebendo Status: 201 Created

Essa é minha classe TopicosController:

package br.com.alura.forum.controller;

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.forum.controller.dto.TopicoDto;
import br.com.alura.forum.controller.form.TopicoForm;
import br.com.alura.forum.modelo.Topico;
import br.com.alura.forum.repository.CursoRepository;
import br.com.alura.forum.repository.TopicoRepository;

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

    @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.converter(topicos);
        } else {
            List<Topico> topicos = topicoRepository.findByCursoNome(nomeCurso);
            return TopicoDto.converter(topicos);
        }
    }

    @PostMapping
    public ResponseEntity<TopicoDto> cadastrar(@RequestBody @Valid TopicoForm form, UriComponentsBuilder uriBuilder) {
        Topico topico = form.convertFromForm(cursoRepository);
        topicoRepository.save(topico);

        URI uri = uriBuilder.path("/topicos/{id}").buildAndExpand(topico.getId()).toUri();
        return ResponseEntity.created(uri).body(new TopicoDto(topico));
    }

}

E essa é minha classe TopicosForm:

package br.com.alura.forum.controller.form;

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

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

public class TopicoForm {

    @NotNull
    @NotEmpty
    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 String getNomeCurso() {
        return nomeCurso;
    }

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

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

}

Desde já, agradeço à quem retornar.

3 respostas
solução!

Olá Luiz! Tudo bem? Eu não conheço exatamente o contexto da aula que você está estudando, mas um palpite do que pode ter acontecido é não ter a dependencia do spring-boot-starter-validation no seu classpath. Se for um projeto maven, tenta adicionar a dependência no pom.xml:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-validation</artifactId> 
</dependency>

Se for um projeto gradle, adiciona no build.gradle:

implementation 'org.springframework.boot:spring-boot-starter-validation

A partir da versão 2.3 do spring boot passou a ser necessário declarar explicitamente essa dependência. Talvez seja o seu caso. Espero que ajude!

Oi Luiz,

O codigo esta certinho, deveria ter funcionado.

Voce chegou a reiniciar o servidor, so por garantia? :D

Obrigado Jailson. Era exatamente isso. E ao Rodrigo que também respondeu, obrigado também. Mas eu havia reiniciado o servidor, o eclipse e tudo mais. hahah

Eu havia adicionado a biblioteca do Javax Validation, mas não era a do Spring. Com essa que você mandou, deu certo.

Outra coisa também é que para usar o @Length(min = 5) que ele utiliza na aula, é necessário incluir a biblioteca do spring-hibernate:

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-hibernate</artifactId>
            <version>1.2.9</version>
</dependency>