首页 文章

WSO2 ESB:使用Salesforce Connector时出现意外的字符错误

提问于
浏览
13

当试图按照WSO2 directions更新salesforce记录时,我收到以下错误 .

Saleforce适配器 - 将sObjects注入有效负载时出错:org.apache.axiom.om.OMException:com.ctc.wstx.exc.WstxUnexpectedCharException:prolog中出现意外字符“{”(代码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 connector 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>

4 回答

  • 1

    能够使用WSO2 EI 6.1.0和salesforce connector 2.0.1复制以下行为 .

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

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

    <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 添加到 axis2.xml 中作为 messageType is : text/xml ,默认情况下,这些模板包含在Axis2配置中 .

  • 0

    我可以通过删除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 '<'
    

    请添加更新方法的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

  • 1

    我有两个问题需要了解你来到这里的问题 .

    • 首先,您要使用以下内容在帐户中更新什么?您是否需要更新记录ID,如果是,您必须提供有效的ID?

    • 第二件事是什么是“ValueToChange”?它是Account对象的字段(我不认为这是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>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>
    
  • 2

    此错误的原因是为连接器提供的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

相关问题