【问题标题】:Apache Camel Salesforce Component: Are 'Minor' Relationships Supported?Apache Camel Salesforce 组件:是否支持“次要”关系?
【发布时间】:2020-12-04 09:32:50
【问题描述】:

我正在从 Jitterbit 迁移到 Camel 以满足我们的数据集成需求。

但我在使用 Camel Salesforce 组件时遇到了一个严重问题。有问题的 SOQL 查询是:

SELECT      Account.Owner.Id,   Lookup(User)
        Account.Owner.Name, Lookup(User)
        Id,
        Name,
        Owner.Id,   Lookup(User)
        Owner.Name, Lookup(User)
        QualifyingRep__r.Name,  Lookup(User)
        Solution_Architect__r.Name, Lookup(User)
        StageName,
        Type,
        (SELECT
                Id,
                Name,
                Product2.Name,  Lookup(Product)
                Quantity,
                TotalPrice,
                UnitPrice
            FROM OpportunityLineItems
        ),
        (SELECT
                Id,
                CurrencyIsoCode,
                SplitAmount,
                SplitOwner.Id,  Lookup(User)
                SplitOwner.Name,    Lookup(User)
                SplitPercentage,
                SplitType.MasterLabel   Lookup()
            FROM OpportunitySplits
        )               
    FROM Opportunity
    WHERE StageName = 'Closed Won'

我添加了Lookup(User) 来注释这些存在的“次要”关系。

返回的 JSON 是:

{
    "attributes": {
        "referenceId": null,
        "type": "Opportunity",
        "url": "/services/data/v49.0/sobjects/Opportunity/<guid>"
    },
    "Type": "New Revenue",
    "StageName": "Closed Won",
    "Account": {
        "attributes": {
            "referenceId": null,
            "type": "Account",
            "url": "/services/data/v49.0/sobjects/Account/<guid>"
        }
    },
    "OpportunityLineItems": {
        "done": true,
        "totalSize": 5,
        "nextRecordsUrl": null,
        "records": [
            {
                "attributes": {
                    "referenceId": null,
                    "type": "OpportunityLineItem",
                    "url": "/services/data/v49.0/sobjects/OpportunityLineItem/<guid>"
                },
                "Quantity": 1.0,
                "UnitPrice": 11990.0,
                "TotalPrice": 11990.0,
                "Name": "XXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY",
                "Id": "<guid>"
            },
            {
                "attributes": {
                    "referenceId": null,
                    "type": "OpportunityLineItem",
                    "url": "/services/data/v49.0/sobjects/OpportunityLineItem/<guid>"
                },
                "CurrencyIsoCode": "USD",
                "Quantity": 1.0,
                "UnitPrice": 2758.0,
                "TotalPrice": 2758.0,
                "Name": "XXXXXXXXXXXXXXXXXXXXXX ZZZZZZZZZZZZZZ",
                "Id": "<guid>"
            }
        ]
    },
    "OpportunitySplits": {
        "done": true,
        "totalSize": 2,
        "nextRecordsUrl": null,
        "records": [
            {
                "attributes": {
                    "referenceId": null,
                    "type": "OpportunitySplit",
                    "url": "/services/data/v49.0/sobjects/OpportunitySplit/<guid>"
                },
                "CurrencyIsoCode": "USD",
                "SplitPercentage": 100.0,
                "SplitAmount": 23392.0,
                "Id": "<guid>"
            },
            {
                "attributes": {
                    "referenceId": null,
                    "type": "OpportunitySplit",
                    "url": "/services/data/v49.0/sobjects/OpportunitySplit/<guid>"
                },
                "CurrencyIsoCode": "USD",
                "SplitPercentage": 0.0,
                "SplitAmount": 0.0,
                "Id": "<guid>"
            }
        ]
    },
    "Name": "XXXXXXXXXXXXXXXXXXXXXX",
    "Id": "<guid>"
}

注意:查询结果应该是分散的名称,但不能返回一个。这是一个展示停止器,因为集成的目的是在另一个系统中计算佣金(我们绝对必须知道 支付)。

在生成 DTO 时,camel-salesforce-maven-plugin 也会发生同样的情况 - 那里也不支持这些关系。事实上,我首先注意到这里的问题,是在将 Salesforce DTO 的转换迁移到目标 DTO 时。它不是 Opportunity.Account.OwnerId 返回 User 对象,而是返回 String

我提出这个是因为Opportunity DTO 有AccountAccountId 分别返回一个Account 对象和一个String。如果所有生成的 DTO 都遵循此模式,则不会有问题。

我相信 Jitterbit 使用 Salesforce SOAP API - 这一切都发生在幕后,所以我不能确定。有一件事肯定的,Salesforce 中定义的所有关系都可以在 Jitterbit 中使用,所以我对 Camel Salesforce 组件中发生的事情感到困惑。

我需要做些什么来让 所有 DTO 中生成的关系,当然还有让查询返回 所有 请求的东西吗?

更新

我已经在 POSTMAN 中使用简化查询对此进行了测试:

{{instance_url}}/services/data/{{api_version}}/query?q=SELECT Id, Name, Account.Owner.Name FROM Opportunity WHERE StageName = 'Closed Won' AND id = '&lt;guid&gt;'

返回的 JSON 是:

{
    "totalSize": 1,
    "done": true,
    "records": [
        {
            "attributes": {
                "type": "Opportunity",
                "url": "/services/data/v49.0/sobjects/Opportunity/<guid>"
            },
            "Id": "<guid>",
            "Name": "XXXXXXXXXXXXXXXXXXXXXXX",
            "Account": {
                "attributes": {
                    "type": "Account",
                    "url": "/services/data/v49.0/sobjects/Account/<guid>"
                },
                "Owner": {
                    "attributes": {
                        "type": "User",
                        "url": "/services/data/v49.0/sobjects/User/<guid>"
                    },
                    "Name": "<user name>"
                }
            }
        }
    ]
}

虽然经过大量编辑,但 Account.Owner.Name 路径明显存在,这表明这是 Camel Salesforce 组件问题。

【问题讨论】:

    标签: java rest apache-camel salesforce dto


    【解决方案1】:

    在这种情况下,解决方案是确保正确生成所有 DTO。

    首先,确保插件列出了正确的对象名称:

    <includes>
        <include>Account</include>
        <include>Invoice__c</include>
        <include>Opportunity</include>
        <include>OpportunityLineItem</include>
        <include>OpportunitySplit</include>
        <include>OpportunitySplitType</include>
        <include>Product2</include>
        <include>User</include>
    </includes>
    

    就我而言,我第一次使用InvoiceProduct

    然后我逐行比较查询并确保生成的 DTO 支持所有关系。 这需要在关系缺失的地方进行一些手动操作

    例如,需要将 Invoice 添加到 Opportunity:

    @XStreamAlias("Invoice_2014__r")
    private Invoice__c Invoice_2014__r;
    
    /**
     * @return the Invoice_2014__r
     */
    @JsonProperty("Invoice_2014__r")
    public Invoice__c getInvoice_2014__r() {
        return Invoice_2014__r;
    }
    
    /**
     * @param Invoice_2014__r the Invoice_2014__r to set
     */
    @JsonProperty("Invoice_2014__r")
    public void setInvoice_2014__r(Invoice__c Invoice_2014__r) {
        this.Invoice_2014__r = Invoice_2014__r;
    }
    

    当 DTO 完全支持查询时,一切都按预期工作。

    我不明白为什么 DTO 需要人工干预,因为所有必要的关系都是通过工作台 (https://workbench.developerforce.com) 定义和观察的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 2014-10-09
      • 1970-01-01
      • 2020-09-14
      相关资源
      最近更新 更多