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

[Dúvida] Dúvida sobre erro 400

Meu código está idêntico ao do professor, e mesmo assim, quando disparo um cadastro que não contém os campos obrigatórios ele da ERROR 500 ao invés do 400, não sei o que pode ser, já reescrevi tudo o que podia, segue abaixo como está o meu código (estou fazendo outro tipo de sistema de cadastro por isso alguns campos são diferentes):

package com.sistemacadastro.api.infra;

import jakarta.persistence.EntityNotFoundException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class TratadorDeErros {

    @ExceptionHandler(EntityNotFoundException.class)
    public ResponseEntity tratarErro404() {
        return ResponseEntity.notFound().build();
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity tratarErro400() {
        return ResponseEntity.badRequest().build();
    }
}
package com.sistemacadastro.api.domain.usuario;

import com.sistemacadastro.api.domain.endereco.DadosEndereco;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;

public record DadosCadastroUsuario(
        @NotBlank
        String nome,
        @NotBlank
        String email,
        @NotBlank
        @Pattern(regexp = "\\d{11}")
        String cpf,
        @NotBlank
        @Pattern(regexp = "\\d{11}")
        String celular,
        @NotNull
        @Valid
        DadosEndereco endereco) {
}

a parte do código do tratarErro400 está da maneira inicial ainda, mas já deveria mostrar erro 400 no Insomnia, já recarreguei a maven pra ver se era problema no plugin, e já até reinseri o código da dependency no arquivo pom.xml e mesmo assim, continua retornando código 500. Algo estranho que aconteceu também, foi que a primeira vez eu fiz um teste com os campos no JSON assim:

{
"nome": "",
"email": "",
"cpf": "",
"celular" : "",    
"endereco": {
        "cep": "12345678",
        "uf": "SP",
        "cidade": "São Paulo",
        "bairro": "bairro",
    "logradouro": "rua 2"
    }
}

ele foi salvo no banco de dados (lembrando que os campos estão marcados como @NotBlank no DadosUsuarioCadastro)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

campo da dependency no arquivo pom.xml:

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

Oi Gabriel!

Posta aqui o código da sua classe controller

package com.sistemacadastro.api.controller;

import com.sistemacadastro.api.domain.usuario.DadosListagemUsuario;
import com.sistemacadastro.api.domain.usuario.Usuario;
import com.sistemacadastro.api.domain.usuario.UsuarioRepository;
import com.sistemacadastro.api.domain.usuario.*;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.UriComponentsBuilder;

@RestController
@RequestMapping("usuarios")
public class UsuarioController {

    @Autowired
    private UsuarioRepository repository;

    @PostMapping
    @Transactional
    public ResponseEntity cadastrar(@RequestBody DadosCadastroUsuario dados, UriComponentsBuilder uriBuilder) {

        var usuario = new Usuario(dados);
        repository.save(usuario);

        var uri = uriBuilder.path("/usuarios/{id}").buildAndExpand(usuario.getId()).toUri();

        return ResponseEntity.created(uri).body(new DadosDetalhamentoUsuario(usuario));
    }

    @GetMapping
    public ResponseEntity<Page<DadosListagemUsuario>> listar(@PageableDefault(size = 10, sort = {"nome"}) Pageable pageable) {
        var page = repository.findAllByAtivoTrue(pageable).map(DadosListagemUsuario::new);

        return ResponseEntity.ok(page);
    }

    @PutMapping
    @Transactional
    public ResponseEntity atualizar(@RequestBody @Valid DadosAtualizacaoUsuario dados) {
        var usuario = repository.getReferenceById(dados.id());
        usuario.atualizarInformacoes(dados);

        return ResponseEntity.ok(new DadosDetalhamentoUsuario(usuario));
    }

    @DeleteMapping("/{id}")
    @Transactional
    public ResponseEntity desativar(@PathVariable Long id) {
        var usuario = repository.getReferenceById(id);
        usuario.desativar();

        return ResponseEntity.noContent().build();
    }


    @GetMapping("/{id}")
    public ResponseEntity detalhar(@PathVariable Long id) {
        var usuario = repository.getReferenceById(id);

        return ResponseEntity.ok(new DadosDetalhamentoUsuario(usuario));
    }
}
solução!

No método cadastrar faltou anotar o dto com @Valid.