1
resposta

[Projeto] Erro no endpoint

Endpoint /artistas esta funcionando normal! EndPOint /artistas/{nome} dando o erro abaixo: Erro:

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

ScreenSoundAPI/program.cs :

using Microsoft.AspNetCore.Diagnostics;
using ScreenSound.Banco;
using ScreenSound.Modelos;
using System.Text.Json.Serialization;

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options => options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
var app = builder.Build();

app.MapGet("/artistas", () =>
{
    var dal = new DAL<Artista>(new ScreenSoundContext());
    return dal.Listar();
});
app.MapGet("/artistas/{nome}", (string nome, ILogger<Program> logger) =>
{
    var dal = new DAL<Artista>(new ScreenSoundContext());
    return dal.RecuperarPor(a => a.Nome.ToUpper().Equals(nome.ToUpper()));
});

app.Run();

ScreenSound.Shared.Dados/Banco/DAL.cs :
using Microsoft.EntityFrameworkCore;
using ScreenSound.Modelos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ScreenSound.Banco
{
    public class DAL<T> where T : class
    {
        private  readonly ScreenSoundContext context;

        public DAL(ScreenSoundContext context)
        {
            this.context = context;
        }

        public IEnumerable<T> Listar()
        {
            return context.Set<T>().ToList();
        }
        public void Adicionar(T objeto)
        {
            context.Set<T>().Add(objeto);
            context.SaveChanges();
        }
        public void Atualizar(T objeto)
        {
            context.Set<T>().Update(objeto);
            context.SaveChanges();
        }
        public void Deletar(T objeto)
        {
            context.Set<T>().Remove(objeto);
            context.SaveChanges();
        }
        public T? RecuperarPor(Func<T, bool> condicao) => context.Set<T>().FirstOrDefault(condicao);

        public IEnumerable<T> RecuperarListaPor(Func<T, bool> condicao)
        {
            return context.Set<T>().Where(condicao).ToList();
        }
    }
}
1 resposta

Olá Emely, tudo bem?

O erro que você está enfrentando, ArgumentNullException: Value cannot be null. (Parameter 'obj'), sugere que alguma operação está tentando usar um valor nulo onde não deveria. Esse problema pode estar relacionado ao fato de que o endpoint /artistas/{nome} não está encontrando um artista correspondente e, em seguida, tenta serializar um valor nulo.

Vamos ajustar o código para lidar com essa situação. Primeiro, vamos verificar se o artista foi encontrado antes de retornar a resposta. Se o artista não for encontrado, retornaremos um código de status 404 (Not Found).

Aqui está a versão ajustada do seu código:

app.MapGet("/artistas", () =>
{
    var dal = new DAL<Artista>(new ScreenSoundContext());
    return Results.Ok(dal.Listar());
});

app.MapGet("/artistas/{nome}", (string nome, ILogger<Program> logger) =>
{
    var dal = new DAL<Artista>(new ScreenSoundContext());
    var artista = dal.RecuperarPor(a => a.Nome.ToUpper().Equals(nome.ToUpper()));
    if (artista == null)
    {
        return Results.NotFound(new { Message = "Artista não encontrado" });
    }
    return Results.Ok(artista);
});

Nessa versão, estamos verificando explicitamente se artista é nulo. Se for, retornamos um Results.NotFound() com uma mensagem indicando que o artista não foi encontrado. Caso contrário, retornamos o artista encontrado com Results.Ok().

Essa abordagem deve evitar o erro de ArgumentNullException e fornecer uma resposta mais clara quando o artista não for encontrado. Caso essa abordagem não solucione o seu problema, peço que compartilhe todo o seu código, via GitHub ou Drive do Google, para que eu realize testes para identificar o problema.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.