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

时间:2017-08-08 21:56:00

标签: wso2 wso2esb wso2carbon sfdc

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

  

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

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

3 个答案:

答案 0 :(得分:2)

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

  

Saleforce适配器 - 将sObjects注入有效负载时出错:   org.apache.axiom.om.OMException:   com.ctc.wstx.exc.WstxUnexpectedCharException:意外的字符'{'   (代码123)pr​​olog;预期'&lt;'

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

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

答案 1 :(得分:1)

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

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

  2. 第二件事是&#34; ValueToChange&#34;?它是Account对象的字段(我不认为这是帐户对象的字段)吗?

  3. 您可以修改下面的代理并尝试。

    <?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 :(得分: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