[Java, Spring] Erro ao fazer uma requisição GET com o insomnia

Coloquei o endereço certinho, tanto lá no código através da anotação “RequestMapping” como dentro do Insomnia, e ainda sim acusa o erro como se não existisse.

Insomnia:

Código da classe de repositório:

package com.higormorais.repository;

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Optional;

import org.springframework.stereotype.Repository;

import com.higormorais.model.Produto;

@Repository
public class ProdutoRepository {

	private List<Produto> produtos = new ArrayList<>();
	private Integer ultimoId = 0;
	
	public List<Produto> obterTodos() {
		return produtos;
	}
	
	public Optional<Produto> obterPorId(Integer id) {
		return produtos.stream().filter(produto -> produto.getId() == id).findFirst();
	}
	
	public void adicionar(Produto produto) {
		ultimoId++;
		produto.setId(ultimoId);
		produtos.add(produto);
	}
	
	public void deletar(Integer id) {
		produtos.removeIf(produto -> produto.getId() == id);
	}
	
	public void atualizar(Produto produto) {
		Optional<Produto> produtoEncontrado = obterPorId(produto.getId());
		
		if(produtoEncontrado.isEmpty()) {
			throw new InputMismatchException("Produto não encontrado");
		}
		
		deletar(produto.getId());
		
		produtos.add(produto);
	}	
}

Código da classe de serviço:

package com.higormorais.service;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.higormorais.model.Produto;
import com.higormorais.repository.ProdutoRepository;

@Service
public class ProdutoService {

	@Autowired
	private ProdutoRepository produtoRepository;
	
	public List<Produto> obterTodos() {
		return produtoRepository.obterTodos();
	}
	
	public Optional<Produto> obterPorId(Integer id) {
		return produtoRepository.obterPorId(id);
	}
	
	public void adicionar(Produto produto) {
		produtoRepository.adicionar(produto);
	}
	
	public void deletar(Integer id) {
		produtoRepository.deletar(id);
	}
	
	public void atualizar(Integer id, Produto produto) {
		produto.setId(id);
		produtoRepository.atualizar(produto);
	}
}

Código da classe de controller:

package com.higormorais.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.higormorais.model.Produto;
import com.higormorais.service.ProdutoService;

@RestController
@RequestMapping("/api/produtos")
public class ProdutoController {

	@Autowired
	private ProdutoService produtoService;
	
	@GetMapping
	public List<Produto> obterTodos() {
		return produtoService.obterTodos();
	}	
}

Código da classe principal:

package com.higormorais.usandospring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class PrimeiroExemplo1Application {

	public static void main(String[] args) {
		SpringApplication.run(PrimeiroExemplo1Application.class, args);
	}
}

Nota 1: Desculpe-me pela gambiarra cometidas na classe do repositório, mas é que esse código estou fazendo de um curso de back-end para Java com Spring, e o professor do mesmo está fazendo desse jeito, e como eu ainda não sei muitas coisas sobre este framework e o padrão restfull, decidi seguir de acordo com o que estava sendo feito.

Nota 2: Pelo Postman o mesmo erro é acusado.

Nota 3: Também tentei mudar o endereço que está na anotação RequestMapping da classe do controller.

Nâo vi gambiarra no código. Foi uma forma de pensar, e achei muito bem implementado.


Sobre o problema, vc chegou a adicionar alguma configuração no application.yaml (ou application.properties)?

Aparece algum erro no console quando vc sobe o projeto?

Não adicionei nada não em arquivo nenhum, só criei e fiz as classes de cada camada. Você está se referindo ao console da IDE quando rodo a aplicação? Se sim, ela não acusa nenhum erro.

Não sei se isso pode te ajudar a me ajudar, mas no curso que estou fazendo, o cara está usando o VSCode, enquanto eu estou utilizando o Spring Tool Suite (IDE do Eclipse feita para usar o Spring Boot).

Entendi. Acho que não tem relação com a IDE não. Fiquei na dúvida se, por acaso, esteja sendo necessário informar o contexto da aplicação na URL, mas com spring-boot, geralmente, não é preciso, o contexto acaba sendo a /.

De qualquer forma, vc pode postar aqui o que é impresso no console quando vc sobe a aplicação?

Saída do console da IDE:

Saída no Insonmia:

{
“timestamp”: “2021-12-06T20:23:46.325+00:00”,
“status”: 404,
“error”: “Not Found”,
“message”: “No message available”,
“path”: “/api/produtos”
}

Quando for log, tu pode copiar o texto e postar diretamente em vez de mandar imagem, pois fica bem melhor de ver.

Inclusive, na imagem, cortou a parte que queria ver, que é referente ao contexto que foi iniciado (na mesma linha onde foi impresso a porta).

O contexto foi iniciado como / (barra)?

Ah mano, por outro lado, foi ótimo tu mandar o print kkkkk. O problema está na sua estrutura de pacotes. A classe principal PrimeiroExemplo1Application está num pacote que não envolve os pacotes das outras classes. Com isso, o spring, ao escanear os controllers, services, repositories, etc., ele não vai encontrar nenhum.

Altere o pacote da classe PrimeiroExemplo1Application de:

package com.higormorais.usandospring;

para:

package com.higormorais;

Vc também pode especificar onde o spring deve fazer o scan, mas considero melhor vc reorganizar a classe principal.

1 curtida

Passando pra avisar que era isso mesmo, muito obrigado!

1 curtida

Ola saudações estou com o mesmo problema, já tentei a solução porém não obtive sucesso, lucas_camara se estiver por ai pode me dar um help??

Opa, recomendo tu abrir fazer um novo post com sua dúvida e detalhes do projeto. Assim mais gente terá visibilidade para ajudar.