WSO2 ESB: Неожиданная ошибка символов при использовании соединителя Salesforce
При попытке выполнить указания WSO2 для обновления записи Salesforce я получаю следующую ошибку.
Адаптер Saleforce - ошибка ввода sObjects в полезную нагрузку: org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException: Неожиданный символ '{' (код 123) в прологе; ожидаемый '<'
<?xml version="1.0" encoding="UTF-8"?>
<proxy
xmlns="http://ws.apache.org/ns/synapse"
xmlns:sfdc="sfdc" name="SalesforceUpdateTest" startOnLoad="true" statistics="enable" trace="enable" transports="http,https">
<target>
<inSequence>
<sequence key="conf:/SalesforceLoginInfo"/>
<payloadFactory>
<format>
<sfdc:sObjects
xmlns:sfdc="sfdc" type="Account">
<sfdc:sObject>
<sfdc:Id>TestId1</sfdc:Id>
<sfdc:ValueToChange>Yes</sfdc:ValueToChange>
</sfdc:sObject>
</sfdc:sObjects>
</format>
<args/>
</payloadFactory>
<salesforce.update>
<allOrNone>0</allOrNone>
<allowFieldTruncate>0</allowFieldTruncate>
<sobjects
xmlns:sfdc="sfdc">{//sfdc:sObjects}
</sobjects>
</salesforce.update>
</inSequence>
<outSequence>
<send/>
</outSequence>
</target>
</proxy>
Я использую WSO2 EI 6.1.0 и соединитель Salesforce 2.0.1. Идентификатор Salesforce TestId1 существует, как и поле ValueToChange. Моя SalesforceLoginInfo верна (я могу делать запросы Salesforce, а не обновления).
Пытаясь решить проблему, я увидел этот очень похожий вопрос. Но я добавил строки в axis2.xml в соответствии с решением, перезапущен, и проблема все еще существует.
<messageBuilder contentType="application/json" class="org.wso2.carbon.integrator.core.json.JsonStreamBuilder"/>
<messageBuilder contentType="text/javascript" class="org.wso2.carbon.integrator.core.json.JsonStreamBuilder"/>
<messageFormatter contentType="application/json" class="org.wso2.carbon.integrator.core.json.JsonStreamFormatter"/>
<messageFormatter contentType="text/javascript" class="org.wso2.carbon.integrator.core.json.JsonStreamFormatter"/>
Кто-нибудь знает, как исправить эту проблему? Мне кажется, что я просто следую учебному курсу (мой код почти точно представлен в примере с продавцом wso2), но проблема продолжается.
ОБНОВЛЕНИЕ: Чтобы уменьшить путаницу в вызове SalesforceLoginInfo, я удалил это и поместил salesforce.init в код. Ошибка остается прежней.
<?xml version="1.0" encoding="UTF-8"?>
<proxy
xmlns="http://ws.apache.org/ns/synapse"
xmlns:sfdc="sfdc" name="SalesforceUpdateTest" startOnLoad="true" statistics="enable" trace="enable" transports="http,https">
<target>
<inSequence>
<salesforce.init>
<username>[email protected]</username>
<password>mypasswordandmytoken</password>
<loginUrl>https://test.salesforce.com/services/Soap/u/27.0</loginUrl>
<blocking>true</blocking>
</salesforce.init>
<payloadFactory>
<format>
<sfdc:sObjects
xmlns:sfdc="sfdc" type="Account">
<sfdc:sObject>
<sfdc:Id>TestId1</sfdc:Id>
<sfdc:ValueToChange>Yes</sfdc:ValueToChange>
</sfdc:sObject>
</sfdc:sObjects>
</format>
<args/>
</payloadFactory>
<salesforce.update>
<allOrNone>0</allOrNone>
<allowFieldTruncate>0</allowFieldTruncate>
<sobjects
xmlns:sfdc="sfdc">{//sfdc:sObjects}
</sobjects>
</salesforce.update>
</inSequence>
<outSequence>
<send/>
</outSequence>
</target>
</proxy>
Ответы
Ответ 1
Была возможность реплицировать поведение ниже с помощью WSO2 EI 6.1.0 и соединителя Salesforce 2.0.1.
Адаптер Saleforce - ошибка ввода sObjects в полезную нагрузку: org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException: Неожиданный символ '{' (код 123) в прологе; ожидаемый '<'
Найдите приведенную ниже прокси-последовательность, используемую для ее исправления. Обходной путь состоял в том, чтобы загрузить полезную нагрузку в собственность и передать ее операции salesforce <salesforce.update>
через переменную Synapse XPath $ctx
<payloadFactory media-type="xml">
<format>
<sfdc:sObjects xmlns:sfdc="sfdc" type="Account">
<sfdc:sObject>
<sfdc:Id>0011I001102zk24PZA</sfdc:Id>
<sfdc:Description>Account1</sfdc:Description>
</sfdc:sObject>
</sfdc:sObjects>
</format>
<args/>
</payloadFactory>
<log level="full"/>
<log>
<property xmlns:sfdc="sfdc" expression="//sfdc:sObjects" name="n****n"/>
</log>
<property xmlns:sfdc="sfdc"
expression="//sfdc:sObjects"
name="sobjectPayload"
scope="default"
type="OM"/>
<log>
<property expression="get-property('sobjectPayload')"
name="fromProp****"/>
</log>
<salesforce.update>
<allOrNone>0</allOrNone>
<allowFieldTruncate>1</allowFieldTruncate>
<sobjects>{$ctx:sobjectPayload}</sobjects>
</salesforce.update>
Была обновлена запись Salesforce, в этом случае свойство Описание объекта учетной записи.
Также нет необходимости добавлять новые messageBuilder
или messageFormatter
в axis2.xml
как messageType is : text/xml
в шаблонах соединителей Salesforce, которые по умолчанию включены в конфигурацию Axis2.
Ответ 2
Я могу воспроизвести ошибку, удалив операцию init.
[2017-08-12 09:39:17,315] ERROR - SetupUpdateSobjects Saleforce adaptor - error injecting sObjects to payload : org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '{' (code 123) in prolog; expected '<'
Пожалуйста, добавьте начало операции инициализации метода обновления.
<salesforce.init>
<loginUrl>{$ctx:loginUrl}</loginUrl>
<username>{$ctx:username}</username>
<password>{$ctx:password}</password>
<blocking>{$ctx:blocking}</blocking>
</salesforce.init>
<payloadFactory>
<format>
<sfdc:sObjects xmlns:sfdc="sfdc" type="Account">
<sfdc:sObject>
<sfdc:Id>$1</sfdc:Id>
<sfdc:Name>$2</sfdc:Name>
</sfdc:sObject>
</sfdc:sObjects>
</format>
<args>
<arg expression="get-property('id')"/>
<arg expression="get-property('newName')"/>
</args>
</payloadFactory>
<salesforce.update>
<allOrNone>{$ctx:allOrNone}</allOrNone>
<allowFieldTruncate>{$ctx:allowFieldTruncate}</allowFieldTruncate>
<sobjects xmlns:sfdc="sfdc">{//sfdc:sObjects}</sobjects>
</salesforce.update>
или вы создаете локальную запись для init и вызываете ее в прокси [1].
<payloadFactory>
<format>
<sfdc:sObjects xmlns:sfdc="sfdc" type="Account">
<sfdc:sObject>
<sfdc:Id>$1</sfdc:Id>
<sfdc:Name>$2</sfdc:Name>
</sfdc:sObject>
</sfdc:sObjects>
</format>
<args>
<arg expression="get-property('id')"/>
<arg expression="get-property('newName')"/>
</args>
</payloadFactory>
<salesforce.update configkey="sf_init">
<allOrNone>{$ctx:allOrNone}</allOrNone>
<allowFieldTruncate>{$ctx:allowFieldTruncate}</allowFieldTruncate>
<sobjects xmlns:sfdc="sfdc">{//sfdc:sObjects}</sobjects>
</salesforce.update>
[1] https://docs.wso2.com/display/ESB500/Using+a+Connector
Ответ 3
У меня есть два вопроса, чтобы понять проблему, которую вы получаете здесь.
-
Во-первых, что вы собираетесь обновлять в учетной записи, используя ниже? Вам нужно указать идентификатор записи для обновления, если это так, вы должны указать действительный идентификатор?
-
Во-вторых, что такое ValueToChange? Является ли это поле для объекта Account (я не думаю, что это поле объекта учетной записи)?
Можете ли вы изменить прокси-сервер, как показано ниже, и попробовать.
<?xml version="1.0" encoding="UTF-8"?>
<proxy
xmlns="http://ws.apache.org/ns/synapse"
xmlns:sfdc="sfdc" name="SalesforceUpdateTest" startOnLoad="true" statistics="enable" trace="enable" transports="http,https">
<target>
<inSequence>
<salesforce.init>
<username>[email protected]</username>
<password>mypasswordandmytoken</password>
<loginUrl>https://test.salesforce.com/services/Soap/u/27.0</loginUrl>
<blocking>true</blocking>
</salesforce.init>
<payloadFactory>
<format>
<sfdc:sObjects
xmlns:sfdc="sfdc" type="Account">
<sfdc:sObject>
<sfdc:Id>valid salesforce record ID</sfdc:Id>
<sfdc:Name>Jay Smith</sfdc:Name>
</sfdc:sObject>
</sfdc:sObjects>
</format>
<args/>
</payloadFactory>
<salesforce.update>
<allOrNone>0</allOrNone>
<allowFieldTruncate>0</allowFieldTruncate>
<sobjects
xmlns:sfdc="sfdc">{//sfdc:sObjects}
</sobjects>
</salesforce.update>
</inSequence>
<outSequence>
<send/>
</outSequence>
</target>
</proxy>
Ответ 4
Причиной этой ошибки является наличие нового символа линии после параметра xpath, заданного для соединителя.
В прикрепленной конфигурации
<sobjects
xmlns:sfdc="sfdc">{//sfdc:sObjects}
</sobjects>
Правильно один раз должен быть
<sobjects xmlns:sfdc="sfdc">{//sfdc:sObjects}</sobjects>
Когда это произойдет, [1] получит выражение XPATH не значение оценки, которое вызывает эту проблему. Протестировано и найдите рабочий прокси.
<?xml version="1.0" encoding="UTF-8"?>
<proxy
xmlns="http://ws.apache.org/ns/synapse"
xmlns:sfdc="sfdc" name="SalesforceUpdateTest" startOnLoad="true" statistics="enable" trace="enable" transports="http,https">
<target>
<inSequence>
<sequence key="conf:/SalesforceLoginInfo"/>
<payloadFactory>
<format>
<sfdc:sObjects
xmlns:sfdc="sfdc" type="Account">
<sfdc:sObject>
<sfdc:Id>TestId1</sfdc:Id>
<sfdc:ValueToChange>Yes</sfdc:ValueToChange>
</sfdc:sObject>
</sfdc:sObjects>
</format>
<args/>
</payloadFactory>
<salesforce.update>
<allOrNone>0</allOrNone>
<allowFieldTruncate>0</allowFieldTruncate>
<sobjects xmlns:sfdc="sfdc">{//sfdc:sObjects}</sobjects>
</salesforce.update>
</inSequence>
<outSequence>
<send/>`
</outSequence>
</target>
</proxy>
[1] https://github.com/wso2-extensions/esb-connector-salesforce/blob/master/connector/src/main/java/org/wso2/carbon/connector/salesforce/SalesforceUtil.java#L72