Подтвердить что ты не робот

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>
4b9b3361

Ответ 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