【问题标题】:WSO2 ESB: Unexpected Character Error when using Salesforce ConnectorWSO2 ESB:使用 Salesforce 连接器时出现意外字符错误
【发布时间】:2017-08-08 21:55:59
【问题描述】:

当尝试按照 WSO2 directions 更新销售人员记录时,我收到以下错误。

Saleforce 适配器 - 向有效负载注入 sObject 时出错: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 ID TestId1 与 ValueToChange 字段一样存在。我的 SalesforceLoginInfo 是正确的(我可以进行 Salesforce 查询,只是不能更新)。

尝试解决问题我看到了这个very similar 问题。但是我已经按照解决方案在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 salesforce 示例),但问题仍然存在。

更新:为了减少对 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>developer@mycompany.com</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>

【问题讨论】:

  • 嗨.. 使用的是哪个版本的 esb?
  • 更新了问题。 wso2ei-6.1.0 是我为 esb 安装的。 Salesforce 连接器是 salesforce-connector-2.0.1
  • 嗨.. 如何在不使用凭据的情况下调用端点?你错过了这个docs.wso2.com/display/ESBCONNECTORS/…
  • 我将凭证与这一行 一起使用。我知道这行得通,因为如果我用 Salesforce 查询替换更新,它将起作用。
  • 为了进一步消除任何潜在的错误,我删除了它并用正常的初始化进程替换它

标签: wso2 wso2esb wso2carbon sfdc


【解决方案1】:

能够使用 WSO2 EI 6.1.0 和 salesforce 连接器 2.0.1 复制以下行为。

Saleforce 适配器 - 向有效负载注入 sObject 时出错: org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException:意外字符“{” (代码 123)在序言中;预期'

找到以下用于修复它的代理序列。解决方法是将有效负载加载到属性中,并通过 Synapse XPath 变量 $ctx 将其传递给 Salesforce 操作 &lt;salesforce.update&gt;

          <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 记录已更新,在本例中为 Account Object 记录的 Description 属性。

此外,无需在 Salesforce 连接器模板中将新的 messageBuildermessageFormatter 添加为 messageType is : text/xml,默认情况下包含在 Axis2 配置中。

【讨论】:

    【解决方案2】:

    我可以通过删除初始化操作来重现错误。

    [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 '<'
    

    请在更新方法的顶部添加init操作。

                <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

    【讨论】:

    • 我实际上在 中调用了 init,我只是尝试删除它,但仍然遇到相同的错误。为了消除任何混淆,我用不起作用的新代码更新了问题。
    【解决方案3】:

    我有两个问题要了解您遇到的问题。

    1. 首先,您将使用以下内容在 Account 中更新什么?是否需要提供记录ID才能更新,如果需要则必须提供有效ID?

    2. 第二件事是什么是“ValueToChange”?是 Account 对象的字段吗(我不认为这是 Account Object 的字段)?

    你能不能修改下代理试试。

    <?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>developer@mycompany.com</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>
    

    【讨论】:

    • 在这种情况下,我实际上有一个 ValueToChange 字段给 salesforce。它有两个值,No 和 Yes。我使用的 ID 并不是真正的 TestID1,而是一个有效的 salesforce ID,我可以将其用于 SOQL 查询。我确实修改了我的代理以匹配你的,我将字段更改为 sfdc:Name,但我仍然得到同样的错误。无论我尝试更新哪个字段,它似乎都会发生。
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多