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
我提出这个问题是因为Opportunity
DTO有Account
和AccountId
分别返回一个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 楼答案
在这种情况下,解决方案是确保正确生成所有DTO
首先,确保插件列出了正确的对象名称:
在我的例子中,我第一次使用了
Invoice
和Product
然后,我逐行比较查询,并确保生成的DTO支持所有关系这需要在缺少关系的地方手动启动
例如,有必要将发票添加到Opportunity:
当DTO完全支持查询时,一切都按预期进行
我不明白为什么DTO需要手动干预,因为所有必要的关系都是通过工作台(https://workbench.developerforce.com)定义和观察的