有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Apache Camel Salesforce组件:是否支持“次要”关系?

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

但我面临着骆驼销售团队组件的一个严重问题。所讨论的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>"
}

NB:查询结果应分散显示名称,但不返回单个名称。这是一个障碍,因为整合的目的是在另一个系统中计算佣金(我们绝对必须知道谁来支付)

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

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

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

我是否需要做些什么来获得dto中生成的all关系,当然也要让查询返回所请求的所有内容

更新

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

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

返回的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路径显然存在,这向我表明这是一个驼峰Salesforce组件问题


共 (1) 个答案

  1. # 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支持所有关系这需要在缺少关系的地方手动启动

    例如,有必要将发票添加到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)定义和观察的