当前位置: 首页 > 知识库问答 >
问题:

使用Apache Olingo指定实体类型

年光明
2023-03-14
https://docs.microsoft.com/en-us/dynamics365/customer-engagement/web-api/merge?view=dynamics-ce-odata-9
    "@odata.type": "Microsoft.Dynamics.CRM.account"
    "@odata.type@odata.type": "String", 
    "@odata.type": "Microsoft.Dynamics.CRM.account"
An error occurred while validating input parameters: Microsoft.OData.ODataException: Does not support untyped value in non-open type.
  at System.Web.OData.Formatter.Deserialization.DeserializationHelpers.ApplyProperty(ODataProperty property, IEdmStructuredTypeReference resourceType, Object resource, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext)
  at System.Web.OData.Formatter.Deserialization.ODataResourceDeserializer.ApplyStructuralProperties(Object resource, ODataResourceWrapper resourceWrapper, IEdmStructuredTypeReference structuredType, ODataDeserializerContext readContext)
  at Microsoft.Crm.Extensibility.OData.CrmODataEntityDeserializer.ApplyStructuralProperties(Object resource, ODataResourceWrapper resourceWrapper, IEdmStructuredTypeReference structuredType, ODataDeserializerContext readContext)
  at System.Web.OData.Formatter.Deserialization.ODataResourceDeserializer.ReadResource(ODataResourceWrapper resourceWrapper, IEdmStructuredTypeReference structuredType, ODataDeserializerContext readContext)
  at Microsoft.Crm.Extensibility.OData.CrmODataActionPayloadDeserializer.ReadEntry(ODataDeserializerContext readContext, ODataParameterReader reader, IEdmOperationParameter parameter)
  at Microsoft.Crm.Extensibility.OData.CrmODataActionPayloadDeserializer.Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)
  at System.Web.OData.Formatter.ODataMediaTypeFormatter.ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) [HTTP/1.1 400 Bad Request]

作为参考,以下请求正文使用postman(普通的旧http客户端)工作:

{
    "Target": {
        "accountid": "b68c98c3-f339-e811-eeee-000d3a137a33",
        "@odata.type": "Microsoft.Dynamics.CRM.account"
    },
    "Subordinate": {
        "accountid": "f89a8c95-2353-e811-wwww-000d3a137896",
        "@odata.type": "Microsoft.Dynamics.CRM.account"
    },
    "UpdateContent": {
        "websiteurl": "testdata.com",
        "@odata.type": "Microsoft.Dynamics.CRM.account"
    },
    "PerformParentingChecks": "false"
} 

提前感谢你抽出时间来帮助我。

共有1个答案

赖星驰
2023-03-14

当试图使用“类型”系统时,使用Olingo客户机库可能会很费力。请在groovy中查看下面的代码片段,看看是否有帮助:

static AbstractODataInvokeRequest buildMergeRequest(ODataClient client, URI mergeUri,
        String targetLeadIdStr, String subLeadIdStr) {
    Map<String, ClientValue> params = [:]
    params.put("Target", buildEntityIdComplex(client, "leadid", targetLeadIdStr))
    params.put("Subordinate", buildEntityIdComplex(client, "leadid", subLeadIdStr))
    params.put("UpdateContent", buildEntityIdComplex(client, "leadid", "00000000-0000-0000-0000-000000000000"))
    params.put("PerformParentingChecks", client.getObjectFactory().newPrimitiveValueBuilder().buildBoolean(false))

    AbstractODataInvokeRequest funcReq =
            client.getInvokeRequestFactory().getActionInvokeRequest(mergeUri, ODataError.class, params)
                    .addCustomHeader("Authorization", "Bearer ${accessToken}")
    funcReq.setFormat(ContentType.JSON_NO_METADATA)
    return funcReq;
}

static ClientComplexValue buildEntityIdComplex(ODataClient client, String entityIdName, String entityIdValStr) {
    ClientComplexValue targetLeadId = client.getObjectFactory().
            newComplexValue("Microsoft.Dynamics.CRM.lead")
    targetLeadId.add(client.getObjectFactory().newPrimitiveProperty(entityIdName,
            client.getObjectFactory().newPrimitiveValueBuilder().buildGuid(buildKey(entityIdValStr))))
    targetLeadId.add(client.getObjectFactory().newPrimitiveProperty("@odata.type",
            client.getObjectFactory().newPrimitiveValueBuilder().buildString("#Microsoft.Dynamics.CRM.lead")))
    return targetLeadId
}

注意到:

  1. funcreq.setformat(contenttype.json_no_metadata)指示发送到服务器的仅JSON格式。
  2. 从groovy到java,Intellij有一个菜单项来实现这一点。也可以手动添加“;”并且大部分时间都在打字。
 类似资料:
  • 使用NamedNativeQuery时是否可以设置namedEntityGraph? 我获取用户实体如下: 实体图: 然而,我得到以下警告: 设置了javax.persistence.fetchgraph提示,但该值不是EntityGgraph! 那么,是否可以使用命名的本机查询设置实体图? 我当前正在过滤器中为当前REST请求设置用户。我希望能够根据匹配资源方法上的注释动态地为用户获取entit

  • 本文向大家介绍spring如何动态指定具体实现类,包括了spring如何动态指定具体实现类的使用技巧和注意事项,需要的朋友参考一下 在写接口实现时,有时会有多个实现类。这篇文章介绍在调用时通过传入字符串来指定具体的实现类。 一.接口与实现类: 在实现类中重写了toString() 方法,可以自定义字符串,当调用时传入指定的字符串就能获取到相应的bean。  二.register书写: 三.测试类:

  • 我有一个实体类,jpa正在抛出一个验证异常,说明指定了主键。我不明白为什么。 请参阅下面的详细信息:*内部异常:javax.Persistence.persistenceException:Exception[EclipseLink-28018](Eclipse Persistence.Exceptions.EntityManagerSetupException异常描述:Predeployment

  • 我将我的应用程序从spring boot 2.2.5升级到2.3.3,并且我正在使用spring data JPA starter和5.4.20.Final板载。我的实体在编译时得到了增强。 现在,当我使用注释与属性覆盖来自的方法时,我收到了这个警告: 即使这个警告-图是正确获取-我只能看到一个SQL查询日志和应用程序的行为之前的更新。 这是我的存储库代码: 这是我的实体: 如何解决此警告?我可以

  • 我知道类似的问题,但它们是在Hibernate的范围内被问到和回答的。我也有同样的问题,但我正在使用Eclipselink,想知道对于Hibernate,是否有更好的或替代的解决方案。 简单地回顾一下这个问题: 我有两个相互继承的类: 现在我想把一个孩子变成父母,或者反过来。 我希望现在p的数据库行是。 另一种方法是这样的: 在这种情况下,我希望与一起保存,并丢失的值。 然而,上面所描述的并不奏效

  • 我有一个Java7/Spring3.2.17应用程序,它必须连接到两个不同的数据库,因此我有两个不同的persistence.xml文件,每个文件都声明自己的持久性单元。 在我的DAO类中,我只是让Spring注入实体管理器: Spring抱怨我有两个EM工厂,所以它不知道该用哪一个: NouniqueBeanDefinitionException:未定义[javax.persistence.En