使用 NodaTime LocalDate 调用 Web api POST (abp appservice) 无法序列化
Calling Web api POST (abp appservice) with a NodaTime LocalDate fails to serialize
我正在尝试使用 abp.io and implementing NodaTime 编写网页 api。
每当我尝试调用 POST 操作时,我都会得到
The following errors were detected during validation.\r\n - The JSON value could not be converted to NodaTime.LocalDate.
我已经在模块中正确配置了 NodaTime,我还在传统的 .net 5 web 中测试了它 api 并且工作正常。
这是我的配置:
private void ConfigureNodaSerialization()
{
Configure<JsonSerializer>(options =>
{
options.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
//options.Converters.Add(NodaConverters.LocalDateConverter);
});
}
我正在使用 NodaTime.Serialization.JsonNet
我也试过NodaTime.Serialization.SystemTextJson没用,结果一样。
..这是应用服务:
[AllowAnonymous]
public class NodaTestAppService : TestAppService, INodaTestAppService
{
public Task PostNodaTest([FromBody]NodaTestDto dto)
{
return Task.CompletedTask;
}
public Task GetNodaTest(NodaTestDto dto)
{
return Task.CompletedTask;
}
}
GET 工作正常,问题出在 POST。
这是 dto:
public class NodaTestDto
{
public LocalDate Date { get; set; }
public string NodaString { get; set; }
}
我怀疑问题出在 Abp 序列化上。
我在 github here.
上有我的测试解决方案
这是我尝试请求的卷曲:
curl -X 'POST'
'https://localhost:44333/api/app/noda-test/noda-test'
-H 'accept: /'
-H 'Content-Type: application/json'
-H 'RequestVerificationToken: CfDJ8N-JsQhR2mhIqO-RkZtn61KwWgiFfjD60I0EMa07QTooLF9dC8LPmQEDtTws8MpTUtl8b0gtuE-NAiBAXxHEu8IyU8-4w0MfVB4IeZTRsWwXIgzc7pQYReLYnV1IVp0icR5Aj-fMvBqRyvPaNTgVJBc'
-d '{
"date": "1991-08-28",
"nodaString": "string"
}'
ABP 的 source code 显示 Newtonsoft.Json
是在 MvcNewtonsoftJsonOptions
上配置的(而不是 JsonSerializer
):
services.Configure<MvcNewtonsoftJsonOptions>(jsonOptions => {
// configuration settings go here.
}
您可能想以类似的方式使用 NodaTime.Serialization.JsonNet
。
private void ConfigureNodaSerialization(ServiceConfigurationContext context)
{
context.Services.Configure<MvcNewtonsoftJsonOptions>(options =>
{
options.SerializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
});
}
我使用下面的包参考。
<PackageReference Include="NodaTime.Serialization.JsonNet" Version="3.0.0" />
更新
documentation 声明 ABP 正在使用混合方法,使用 System.Text.Json
并回退到 Newtonsoft.Json
来处理不受支持的类型;它展示了如何针对特定的 class 或整个地方继续使用 Newtonsoft.Json
。
我采用的方法是仅将 Newtonsoft.Json
用于 NodaTestDto
class,以及上面显示的 NodaTime
配置。
您 TestHttpApiHostModule
中的 ConfigureNodaSerialization
方法应如下所示。
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);
});
}
现在,当使用 Swagger
UI 发布 { "date": "1991-08-28", "nodaString": "string" }
json
负载时,您的 NodaTestAppService
会收到一个有效的 LocalDate
实例:
我正在尝试使用 abp.io and implementing NodaTime 编写网页 api。 每当我尝试调用 POST 操作时,我都会得到
The following errors were detected during validation.\r\n - The JSON value could not be converted to NodaTime.LocalDate.
我已经在模块中正确配置了 NodaTime,我还在传统的 .net 5 web 中测试了它 api 并且工作正常。
这是我的配置:
private void ConfigureNodaSerialization()
{
Configure<JsonSerializer>(options =>
{
options.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
//options.Converters.Add(NodaConverters.LocalDateConverter);
});
}
我正在使用 NodaTime.Serialization.JsonNet
我也试过NodaTime.Serialization.SystemTextJson没用,结果一样。
..这是应用服务:
[AllowAnonymous]
public class NodaTestAppService : TestAppService, INodaTestAppService
{
public Task PostNodaTest([FromBody]NodaTestDto dto)
{
return Task.CompletedTask;
}
public Task GetNodaTest(NodaTestDto dto)
{
return Task.CompletedTask;
}
}
GET 工作正常,问题出在 POST。
这是 dto:
public class NodaTestDto
{
public LocalDate Date { get; set; }
public string NodaString { get; set; }
}
我怀疑问题出在 Abp 序列化上。
我在 github here.
上有我的测试解决方案这是我尝试请求的卷曲:
curl -X 'POST'
'https://localhost:44333/api/app/noda-test/noda-test'
-H 'accept: /'
-H 'Content-Type: application/json'
-H 'RequestVerificationToken: CfDJ8N-JsQhR2mhIqO-RkZtn61KwWgiFfjD60I0EMa07QTooLF9dC8LPmQEDtTws8MpTUtl8b0gtuE-NAiBAXxHEu8IyU8-4w0MfVB4IeZTRsWwXIgzc7pQYReLYnV1IVp0icR5Aj-fMvBqRyvPaNTgVJBc'
-d '{ "date": "1991-08-28", "nodaString": "string" }'
ABP 的 source code 显示 Newtonsoft.Json
是在 MvcNewtonsoftJsonOptions
上配置的(而不是 JsonSerializer
):
services.Configure<MvcNewtonsoftJsonOptions>(jsonOptions => {
// configuration settings go here.
}
您可能想以类似的方式使用 NodaTime.Serialization.JsonNet
。
private void ConfigureNodaSerialization(ServiceConfigurationContext context)
{
context.Services.Configure<MvcNewtonsoftJsonOptions>(options =>
{
options.SerializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
});
}
我使用下面的包参考。
<PackageReference Include="NodaTime.Serialization.JsonNet" Version="3.0.0" />
更新
documentation 声明 ABP 正在使用混合方法,使用 System.Text.Json
并回退到 Newtonsoft.Json
来处理不受支持的类型;它展示了如何针对特定的 class 或整个地方继续使用 Newtonsoft.Json
。
我采用的方法是仅将 Newtonsoft.Json
用于 NodaTestDto
class,以及上面显示的 NodaTime
配置。
您 TestHttpApiHostModule
中的 ConfigureNodaSerialization
方法应如下所示。
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);
});
}
现在,当使用 Swagger
UI 发布 { "date": "1991-08-28", "nodaString": "string" }
json
负载时,您的 NodaTestAppService
会收到一个有效的 LocalDate
实例: