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

[Bug] Problema ao retornar por nome

Boa tarde, estou com problema ao concluir a Aula 2-6 do curso (.NET: criando uma API Web com ASP.NET Core) onde recebo o erro de objeto nulo, porem o listar funciona perfeitamente ainda com artista sem musica

Listar Insira aqui a descrição dessa imagem para ajudar na acessibilidadePorem ao usar o RecuperarPor

app.MapGet("/Artistas/{nome}", ([FromServices] DAL<Artista> dal, string nome) =>
{
    var artista = dal.RecuperarPor(x => x.Nome.ToUpper().Equals(nome.ToUpper()));

    if (artista is null)
    {
        return Results.NotFound();
    }
    return Results.Ok(artista);
});
*** Erro:**
System.NotSupportedException: The deserialization constructor for type 'Castle.Proxies.ArtistaProxy' contains parameters with null names. This might happen because the parameter names have been trimmed by ILLink. Consider using the source generated serializer instead.
   at System.Text.Json.ThrowHelper.ThrowNotSupportedException_ConstructorContainsNullParameterNames(Type declaringType)
   at System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver.PopulateParameterInfoValues(JsonTypeInfo typeInfo)
   at System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver.CreateTypeInfoCore(Type type, JsonConverter converter, JsonSerializerOptions options)
   at System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver.GetTypeInfo(Type type, JsonSerializerOptions options)
   at System.Text.Json.JsonSerializerOptions.GetTypeInfoNoCaching(Type type)
   at System.Text.Json.JsonSerializerOptions.CachingContext.CreateCacheEntry(Type type, CachingContext context)
--- End of stack trace from previous location ---
   at System.Text.Json.JsonSerializerOptions.GetTypeInfoInternal(Type type, Boolean ensureConfigured, Nullable`1 ensureNotNull, Boolean resolveIfMutable, Boolean fallBackToNearestAncestorType)
   at System.Text.Json.JsonSerializerOptions.GetTypeInfoForRootType(Type type, Boolean fallBackToNearestAncestorType)
   at System.Text.Json.JsonSerializerOptions.TryGetPolymorphicTypeInfoForRootType(Object rootValue, JsonTypeInfo& polymorphicTypeInfo)
   at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.SerializeAsync(Stream utf8Json, T rootValue, CancellationToken cancellationToken, Object rootValueBoxed)
   at Microsoft.AspNetCore.Http.HttpResponseJsonExtensions.WriteAsJsonAsyncSlow[TValue](Stream body, TValue value, JsonSerializerOptions options, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Http.RequestDelegateFactory.ExecuteResultWriteResponse(IResult result, HttpContext httpContext)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

HEADERS
=======
Accept: */*
Connection: keep-alive
Host: localhost:7157
User-Agent: PostmanRuntime/7.35.0
Accept-Encoding: gzip, deflate, br
Postman-Token: 415acd73-28ca-4091-8f82-89b22478bd45
2 respostas
solução!

Oi, Marcelo, tudo bem?

O erro que você apontou, indica um problema de desserialização de JSON ao tentar serializar um objeto do tipo Artista. O erro menciona que o construtor de desserialização para o tipo ArtistaProxy contém parâmetros com nomes nulos. Isso pode estar acontecendo devido a alguma configuração de serialização/desserialização incorreta ou incompatibilidade entre o JSON enviado e a classe Artista.

Uma possível solução seria manter o construtor vazio acima do construtor que tem os parâmetros corretos:

public class Artista
    {
        // Adicionando um construtor vazio
        public Artista() { }

        public Artista(string nome, string bio)
        {
            Nome = nome;
            Bio = bio;
            FotoPerfil = "https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_1280.png";
        }

//CÓDIGO OMITIDO

O trecho public Artista() { } é um construtor vazio que adicionamos à classe Artista. Este construtor vazio, garante que o sistema possa criar objetos, quando necessário, especialmente durante a desserialização dos dados. Ele permite que o sistema saiba como criar um Artista mesmo quando não recebe informações específicas sobre ele.

Outra opção, seria alterar o método buscarPor, na "DAL" para retornar uma lista:

//Método do curso
public T? RecuperarPor(Func<T, bool> condicao)
{
    return context.Set<T>().FirstOrDefault(condicao);
}

//Método alterado para retornar uma lista

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

Neste caso teríamos que alterar o nome do método, pois agora retorna uma lista.

Espero que dê tudo certo. Abraços!

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

Bom dia, obrigado, testei as 2 opções. Decidi aplicar a 1ª opção :)