Porque a minha exception ObjectNotFoundException retorna um erro 500 e não um 404

Tenho o seguinte código que busca uma categoria por id e se não acha o id lança uma exception de object not found, só que em vez de retornar um 404 ele retorna um 500, alguém sabe a causa disso e como posso resolver?

import org.hibernate.ObjectNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

@Service
public class CategoriaService {

    @Autowired
    private CategoriaRepository repository;

    public Categoria buscarCategoriaPorId(Integer id){
        Optional<Categoria> buscaCategoria = repository.findById(id);
        return buscaCategoria.orElseThrow(() -> new ObjectNotFoundException(HttpStatus.resolve(404),"Categoria não encontrada! ID: " + id + ", Tipo: " + Categoria.class.getName()));
    }

Pq vc está lançando uma exceção, o que significa um erro no servidor (http 500). Para retornar 404 explicitamente, vc deve usar o ResponseEntity. Algo mais ou menos assim:

public ResponseEntity<Categoria> buscarCategoriaPorId(Integer id) {
  Optional<Categoria> buscaCategoria = repository.findById(id);
  
  if (buscaCategoria.isPresent()) {
    return ResponseEntity.ok(buscaCategoria.get());
  }
  
  return new ResponseEntity(
    "Categoria não encontrada! ID: " + id + ", Tipo: " + Categoria.class.getName(), 
    HttpStatus.NOT_FOUND
  );
}
1 curtida

Complementando a resposta acima, o primeiro parâmetro do construtor de ObjectNotFoundException é o ID da entidade que você tentou procurar e não foi encontrado.

Portanto passar o status HTTP ali não faz o menor sentido :man_shrugging:

E o segundo parâmetro deveria ser o nome da entidade (entityName), e não uma mensagem de erro formatada.