【发布时间】: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 有Account 和AccountId 分别返回一个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 = '<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 路径明显存在,这表明这是 Camel Salesforce 组件问题。
【问题讨论】:
标签: java rest apache-camel salesforce dto