0

我正在尝试使用 Olingo 提供与 OData 服务交互的客户端(也是用 Olingo 编写的)。我正在尝试发送 PATCH。但是,标准验证例程正在启动,如果我不包含使用标准 Olingo 工具标记为不可为空的实体元素,我会收到错误消息。

https://olingo.apache.org/doc/odata2/tutorials/OlingoV2BasicClientSample.html它说:

使用 HTTP MERGE/PATCH 也可以只发送要更新的数据作为 POST 正文并忽略未更改的数据。但这(当前)未在此示例中显示。

不幸的是,我不确定如何执行此操作,似乎没有任何地方可以向 EntityProvider.writeEntry 方法标记它是 PATCH 而不是 POST/PUT

EntityProviderWriteProperties properties = EntityProviderWriteProperties
            .serviceRoot(rootUri).omitJsonWrapper(true).contentOnly(true)
            .build();

        // serialize data into ODataResponse object
        ODataResponse response = EntityProvider.writeEntry(contentType,
                entitySet, data, properties);

此时在我的代码中,如果“数据”不包含我的不可为空字段的条目,我会收到错误消息。该响应还为不在我的“数据”中的实体的所有属性返回空值。

我通过操纵响应以在“标准”生成之后删除不在我的“数据”中的所有条目来处理这个问题,但想象必须有更好的方法,即使我看不到它。关于如何处理这个问题的任何建议?

4

2 回答 2

3

您必须创建一个“ExpandSelectTreeNode”,其中仅包含要序列化的选定属性的名称。假设您的数据是具有值的 HashMap,您可以使用以下代码作为示例开始:

// data = new HashMap<>();
ExpandSelectTreeNode node = ExpandSelectTreeNode.entitySet(entitySet)
    .selectedProperties(new ArrayList<String>(data.keySet())).build();

EntityProviderWriteProperties properties = EntityProviderWriteProperties
            .serviceRoot(rootUri).omitJsonWrapper(true).contentOnly(true)
            .expandSelectTree(node)
            .build();

// serialize data into ODataResponse object
ODataResponse response = EntityProvider.writeEntry(contentType,
        entitySet, data, properties);

此致

于 2015-10-30T23:46:25.950 回答
0

来自客户端 application/json-patch+json 的内容类型?

于 2015-11-02T00:03:43.953 回答