com.sap.cloud.sdk.datamodel.odata 呈现空字段
com.sap.cloud.sdk.datamodel.odata render empty fields
在 OData 更新请求的上下文中,我们 运行 进入来自调用的 SAP 服务的错误响应。我们在 3.65.0 版本中使用 com.sap.cloud.sdk.datamodel:odata-core。有问题的方法是 com.sap.cloud.sdk.datamodel.odata.helper.FluentHelperUpdate.executeRequest().
当使用来自 com.sap.cloud.sdk.datamodel.odata 的数据在 REST 调用中进行序列化时,空字段也会呈现到输出中:
{
"insuranceId" : "ABC123",
"terminationDate" : null,
"terminationReason" : "UNKNOWN",
"terminationWish" : null,
"terminationReceived" : "/Date(1648027328522)/",
"force" : false
}
这在 SAP 端失败并显示 HttpResult 400 - 错误请求,因为这些字段要么不允许为空,要么根本不允许包含。
我们现在正在寻找一种方法/设置来防止这种情况发生,例如
{
"insuranceId" : "ABC123",
"terminationReason" : "UNKNOWN",
"terminationReceived" : "/Date(1648027328522)/",
"force" : false
}
渲染出来了。
作为解决方法,我们现在使用 com.sap.cloud.sdk.datamodel.odata.helper.FluentHelperUpdate.excludingFields() 如下:
final var emptyEntityFields = new ArrayList<EntityField>();
if(cancellation.getTerminationDate() == null) emptyEntityFields.add(new EntityField("terminationDate"));
if(cancellation.getTerminationWish() == null) emptyEntityFields.add(new EntityField("terminationWish"));
this.dmeEpaService.updateTerminationRequest(terminationRequest)
.replacingEntity()
.excludingFields(emptyEntityFields.toArray(EntityField[]::new))
.executeRequest(this.httpDestination);
此解决方法很麻烦,每个受影响的请求都需要。例如,在 jackson 环境中,设置 @JsonInclude(JsonInclude.Include.NON_NULL) 可以为每个以这种方式注释的实体 class 完成此操作。有关详细信息,请参阅 https://fasterxml.github.io/jackson-annotations/javadoc/2.7/com/fasterxml/jackson/annotation/JsonInclude.Include.html。
免责声明:我是 SAP Cloud SDK for Java 开发团队的一员。
遗憾的是,Java 的 SAP Cloud SDK 当前不支持排除“空”字段(即具有值 null
的字段)以创建/替换 (HTTP POST
/ PUT
) 自动请求。
我们正在考虑在未来添加额外的 API 来支持此类用例。
另请参阅此GitHub Issue了解更多详情。
在 OData 更新请求的上下文中,我们 运行 进入来自调用的 SAP 服务的错误响应。我们在 3.65.0 版本中使用 com.sap.cloud.sdk.datamodel:odata-core。有问题的方法是 com.sap.cloud.sdk.datamodel.odata.helper.FluentHelperUpdate.executeRequest().
当使用来自 com.sap.cloud.sdk.datamodel.odata 的数据在 REST 调用中进行序列化时,空字段也会呈现到输出中:
{
"insuranceId" : "ABC123",
"terminationDate" : null,
"terminationReason" : "UNKNOWN",
"terminationWish" : null,
"terminationReceived" : "/Date(1648027328522)/",
"force" : false
}
这在 SAP 端失败并显示 HttpResult 400 - 错误请求,因为这些字段要么不允许为空,要么根本不允许包含。
我们现在正在寻找一种方法/设置来防止这种情况发生,例如
{
"insuranceId" : "ABC123",
"terminationReason" : "UNKNOWN",
"terminationReceived" : "/Date(1648027328522)/",
"force" : false
}
渲染出来了。
作为解决方法,我们现在使用 com.sap.cloud.sdk.datamodel.odata.helper.FluentHelperUpdate.excludingFields() 如下:
final var emptyEntityFields = new ArrayList<EntityField>();
if(cancellation.getTerminationDate() == null) emptyEntityFields.add(new EntityField("terminationDate"));
if(cancellation.getTerminationWish() == null) emptyEntityFields.add(new EntityField("terminationWish"));
this.dmeEpaService.updateTerminationRequest(terminationRequest)
.replacingEntity()
.excludingFields(emptyEntityFields.toArray(EntityField[]::new))
.executeRequest(this.httpDestination);
此解决方法很麻烦,每个受影响的请求都需要。例如,在 jackson 环境中,设置 @JsonInclude(JsonInclude.Include.NON_NULL) 可以为每个以这种方式注释的实体 class 完成此操作。有关详细信息,请参阅 https://fasterxml.github.io/jackson-annotations/javadoc/2.7/com/fasterxml/jackson/annotation/JsonInclude.Include.html。
免责声明:我是 SAP Cloud SDK for Java 开发团队的一员。
遗憾的是,Java 的 SAP Cloud SDK 当前不支持排除“空”字段(即具有值 null
的字段)以创建/替换 (HTTP POST
/ PUT
) 自动请求。
我们正在考虑在未来添加额外的 API 来支持此类用例。
另请参阅此GitHub Issue了解更多详情。