覆盖 JsonDeserializer 行为
Override JsonDeserializer Behavior
生成器创建了一个 OffsetDateTime 类型的字段:
@Nullable
@ElementName("DocDate")
private OffsetDateTime docDate;
但服务器实际上 returns 日期格式为:YYYY-mm-dd 即 2021-03-07
使用生成的代码时,我收到以下警告:
WARN - Not deserializable: 2021-03-07
覆盖这些字段的反序列化的正确方法是什么?或者这些字段是否正确反序列化?
OffsetDateTime
应该有日期和时间。您的服务响应的数据缺少时间部分。根据 OData V4 ABNF,这是不允许的(假设您的服务是 V4 服务):
dateTimeOffsetValue = year "-" month "-" day "T" hour ":" minute [ ":" second [ "." fractionalSeconds ] ] ( "Z" / SIGN hour ":" minute )
解决此问题的一种方法是更改 属性 类型。您可以:
- 在规范中将其更改为
Edm.Date
- 或在生成的代码中将其更改为
LocalDate
。
当然,这只有在服务始终以日期响应时才有意义。
编辑:如果您确实需要注册自定义类型适配器(例如,因为该服务违反了 JSON 格式),您可以覆盖 GsonVdmAdapterFactory
:
public <T> TypeAdapter<T> create( @Nonnull final Gson gson, @Nonnull final TypeToken<T> type )
{
if( LocalDate.class.isAssignableFrom(rawType) ) {
return (TypeAdapter<T>) new CustomLocalDateTypeAdapter();
} else {
return super.create(gson, type);
}
}
但是,这也需要更改生成的代码,因为目前不方便将自定义类型适配器作为参数传递。更改 @JsonAdapter(com.sap.cloud.sdk.datamodel.odatav4.adapter.GsonVdmAdapterFactory.class)
以引用您的自定义工厂。
不过,在服务修复之前,我仍然建议使用上述解决方法之一。
生成器创建了一个 OffsetDateTime 类型的字段:
@Nullable
@ElementName("DocDate")
private OffsetDateTime docDate;
但服务器实际上 returns 日期格式为:YYYY-mm-dd 即 2021-03-07
使用生成的代码时,我收到以下警告:
WARN - Not deserializable: 2021-03-07
覆盖这些字段的反序列化的正确方法是什么?或者这些字段是否正确反序列化?
OffsetDateTime
应该有日期和时间。您的服务响应的数据缺少时间部分。根据 OData V4 ABNF,这是不允许的(假设您的服务是 V4 服务):
dateTimeOffsetValue = year "-" month "-" day "T" hour ":" minute [ ":" second [ "." fractionalSeconds ] ] ( "Z" / SIGN hour ":" minute )
解决此问题的一种方法是更改 属性 类型。您可以:
- 在规范中将其更改为
Edm.Date
- 或在生成的代码中将其更改为
LocalDate
。
当然,这只有在服务始终以日期响应时才有意义。
编辑:如果您确实需要注册自定义类型适配器(例如,因为该服务违反了 JSON 格式),您可以覆盖 GsonVdmAdapterFactory
:
public <T> TypeAdapter<T> create( @Nonnull final Gson gson, @Nonnull final TypeToken<T> type )
{
if( LocalDate.class.isAssignableFrom(rawType) ) {
return (TypeAdapter<T>) new CustomLocalDateTypeAdapter();
} else {
return super.create(gson, type);
}
}
但是,这也需要更改生成的代码,因为目前不方便将自定义类型适配器作为参数传递。更改 @JsonAdapter(com.sap.cloud.sdk.datamodel.odatav4.adapter.GsonVdmAdapterFactory.class)
以引用您的自定义工厂。
不过,在服务修复之前,我仍然建议使用上述解决方法之一。