2017-08-08 40 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

相關問題