Estoy tratando de escribir una API web usando abp.io e implementando NodaTime . Cada vez que intento llamar a la acción POST, obtengo
Se detectaron los siguientes errores durante la validación.\r\n: el valor JSON no se pudo convertir a NodaTime.LocalDate.
He configurado NodaTime correctamente en el módulo, también lo probé en una api web .net 5 convencional y funciona correctamente.
Aquí está mi configuración:
private void ConfigureNodaSerialization() { Configure<JsonSerializer>(options => { options.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); //options.Converters.Add(NodaConverters.LocalDateConverter); }); }Estoy usando NodaTime.Serialization.JsonNet
También probé NodaTime.Serialization.SystemTextJson sin éxito, con los mismos resultados.
..y aquí está el servicio de aplicaciones:
[AllowAnonymous] public class NodaTestAppService : TestAppService, INodaTestAppService { public Task PostNodaTest([FromBody]NodaTestDto dto) { return Task.CompletedTask; } public Task GetNodaTest(NodaTestDto dto) { return Task.CompletedTask; } }El GET está funcionando bien, el problema es con POST.
Este es el dto:
public class NodaTestDto { public LocalDate Date { get; set; } public string NodaString { get; set; } }Sospecho que el problema está en la serialización de Abp.
Tengo mi solución de prueba en github aquí .
Este es el curl para mi intento de solicitud:
rizo -X 'POST'
'https://localhost:44333/api/app/noda-test/noda-test'
-H' acepta: / '
-H 'Tipo de contenido: aplicación/json'
-H 'Token de verificación de solicitud: CfDJ8N-JsQhR2mhIqO-RkZtn61KwWgiFfjD60I0EMa07QTooLF9dC8LPmQEDtTws8MpTUtl8b0gtuE-NAiBAXxHEu8IyU8-4w0MfVB4IeZTRsWwXIgzc7pQYReLYnV1BIvp0ic
-d '{ "fecha": "1991-08-28", "nodaString": "cadena" }'
El código fuente de ABP muestra que Newtonsoft.Json se está configurando en MvcNewtonsoftJsonOptions (en lugar de JsonSerializer ):
services.Configure<MvcNewtonsoftJsonOptions>(jsonOptions => { // configuration settings go here. } Es posible que desee hacerlo de manera similar usando NodaTime.Serialization.JsonNet .
private void ConfigureNodaSerialization(ServiceConfigurationContext context) { context.Services.Configure<MvcNewtonsoftJsonOptions>(options => { options.SerializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); }); }Utilizo la siguiente referencia del paquete.
<PackageReference Include="NodaTime.Serialization.JsonNet" Version="3.0.0" />ACTUALIZAR
La documentación indica que ABP está utilizando un enfoque híbrido utilizando System.Text.Json y recurriendo a Newtonsoft.Json para tipos no admitidos; muestra cómo puede seguir usando Newtonsoft.Json para clases específicas o en todas partes.
Tomé el enfoque de usar solo Newtonsoft.Json para la clase NodaTestDto , junto con la configuración de NodaTime que se muestra arriba.
Su método ConfigureNodaSerialization dentro de su TestHttpApiHostModule debería verse como a continuación.
private void ConfigureNodaSerialization() { // Use Newtonsoft.Json for NodaTestDto. Configure<AbpSystemTextJsonSerializerOptions>(options => { options.UnsupportedTypes.AddIfNotContains(typeof(NodaTestDto)); }); // Configure Nodatime (de)serialization. Configure<MvcNewtonsoftJsonOptions>(jsonOptions => { jsonOptions.SerializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); }); } Ahora, al publicar una carga útil json { "date": "1991-08-28", "nodaString": "string" } usando la interfaz de usuario de Swagger , su NodaTestAppService recibe una instancia de LocalDate válida: