Warm tip: This article is reproduced from serverfault.com, please click

sap cloud sdk-覆盖 JsonDeserializer 行为

(sap cloud sdk - Override JsonDeserializer Behavior)

发布于 2021-03-12 15:33:26

生成器创建了一个 OffsetDateTime 类型的字段:

@Nullable
@ElementName("DocDate")
private OffsetDateTime docDate;

但服务器实际上以以下格式返回日期:YYYY-mm-dd 即 2021-03-07

使用生成的代码时,我收到以下警告:

WARN - Not deserializable: 2021-03-07

覆盖这些字段的反序列化的正确方法是什么?或者这些字段是否正确反序列化?

Questioner
Conner
Viewed
0
MatKuhr 2021-03-15 16:49:54

AnOffsetDateTime应该同时具有日期和时间。你的服务响应的数据缺少时间部分。根据OData V4 ABNF,这是不允许的(假设你的服务是 V4 服务):

dateTimeOffsetValue = year "-" month "-" day "T" hour ":" minute [ ":" second [ "." fractionalSeconds ] ] ( "Z" / SIGN hour ":" minute )

解决此问题的一种方法是更改​​属性类型。你可以:

  1. 将其更改Edm.Date为规范中
  2. 或者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)以引用你的自定义工厂。

尽管如此,我还是建议使用上述解决方法之一,直到服务得到修复。