2017-08-08 77 views
13

尝试按照WSO2 directions更新salesforce记录时,出现以下错误。WSO2 ESB:使用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 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>[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> 
+0

嗨..这ESB的版本使用? –

+0

更新了问题。 wso2ei-6.1.0是我为esb安装的。 Salesforce连接器是salesforce-connector-2.0.1 –

+0

嗨..如何在不使用凭据的情况下调用端点?你错过了这个https://docs.wso2.com/display/ESBCONNECTORS/Configuring+Salesforce+Connector+Operations – Hariprasath

回答

1

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

+0

我实际上在中调用init,我试图删除它,但仍然得到相同的错误。为了消除任何混淆,我使用不起作用的新代码更新了问题。 –

1

我有两个问题,以了解ü让这里的问题。

  1. 首先,您打算如何使用下面的帐户进行更新?你是否需要给记录ID更新,如果是的话,你必须提供一个有效的ID?

  2. 第二件事是什么是“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>[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> 
+0

在这种情况下,我实际上有一个Salesforce的ValueToChange字段。它有两个值,No和Yes。我使用的ID不是真正的TestID1,而是一个有效的salesforce ID,可以在SOQL查询中使用。我确实修改了我的代理以匹配你的代码,我将该字段更改为sfdc:Name,但我仍然得到相同的错误。无论我尝试更新哪个字段,似乎都会发生。 –

2

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

Saleforce适配器 - 错误注入sObjects有效载荷: org.apache.axiom.om.OMException: com.ctc.wstx.exc。WstxUnexpectedCharException:意外字符'{' (code 123)in prolog;预计'<'

找到下面的代理序列用于修复它。解决方法是把有效载荷装入一个属性,通过突触的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的记录被更新,传递相同的到Salesforce操作<salesforce.update>,在这种情况下帐户对象记录的Description属性。

而且也没有必要增加新messageBuildermessageFormatteraxis2.xml如在Salesforce连接器的模板,这是由在缺省Axis2配置包括messageType is : text/xml

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

相关问题