13

When attempting to follow the WSO2 directions to update a salesforce record I am getting the following error.

Saleforce adaptor - error injecting sObjects to payload : org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '{' (code 123) in prolog; expected '<'

<?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>

I am using WSO2 EI 6.1.0 and the salesforce connector 2.0.1. The Salesforce ID TestId1 exists as does the field ValueToChange. My SalesforceLoginInfo is correct (I can do Salesforce queries, just not updates).

Attempting to solve the problem I saw this very similar question. But I've added the lines to the axis2.xml according to the Solution, restarted, and the problem still exists.

<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"/>

Does anyone know how to fix this problem? I feel like I'm just following a tutorial (my code is nearly exactly the given wso2 salesforce example) and yet the problem continues.

UPDATE: To reduce confusion about the SalesforceLoginInfo call, I removed that and put the salesforce.init in the code. The error is still the same.

<?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

4 回答 4

3

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

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

找到以下用于修复它的代理序列。解决方法是将有效负载加载到属性中,并<salesforce.update>通过 Synapse XPath 变量将其传递给 salesforce 操作$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 记录已更新,在本例中为 Account Object 记录的 Description 属性。

此外,无需添加新的messageBuilder或添加messageFormatter到Salesforce 连接器模板axis2.xmlmessageType is : text/xml,该模板默认包含在 Axis2 配置中。

于 2017-08-27T04:38:01.547 回答
1

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

[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

于 2017-08-12T04:16:55.293 回答
1

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

  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>
于 2017-08-16T10:32:20.147 回答
0

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

于 2017-08-29T03:41:57.927 回答