­

Salesforce中通過SOAP API開發java的web service服務以及踩坑

  • 2019 年 10 月 8 日
  • 筆記

1.下載Salesforce平台中WSDL文件

首先需要的是自己Salesforce平台的許可權通過。登陸自己的Salesforce,下載WSDL文件。

依次點擊右上角你的名字中設置–》集成–》API

在頁面上選擇要生成WSDL的類型,在彈出的頁面選擇 右鍵 –>頁面另存為,即可,如下兩圖顯示:

分別下點生成企業WSDL,生成合作夥伴WSDL,生成元數據WSDL

點擊滑鼠右鍵將文件另保存,可為.xml的形式也可以為.wsdl的文件形式

2.下載並構建WSC Jar,然後把對應的wsdl文件編譯成對應jar

Wsc.jar 下載地址:https://mvnrepository.com/artifact/com.force.api/force-wsc 選擇最新版本的

選擇下圖中的jar就能下載jar包到本地啦(對應jdk版本1.8或者以上)

ST4-4.0.8.jar (https://www.stringtemplate.org/download.html)

如果沒有會報錯:

Exception in thread "main" java.lang.NoClassDefFoundError:org/stringtemplate/v4/STGroupDir

Antlr-runtime-3.5.2.jar (https://mvnrepository.com/artifact/org.antlr/antlr-runtime/3.5.2)

用於java程式碼運行時構造,編譯,轉換的框架。

沒有的話報錯:

Exception in thread "main" java.lang.NoClassDefFoundError: org/antlr/runtime/CharStream

Tools.jar (安裝jdk的目錄下有,無需下載。直接複製)

把剛才下載的jar包和3個wsdl文件放在同一個文件夾中(以下enterprise.jar,metadata.jar,partner.jar是通過下面cmd命令生成jar的)

打開cmd,將路徑定位到剛才的文件目錄。

輸入 java -classpath antlr-runtime-3.5.2.jar;tools.jar;st4-4.0.4.jar;force-wsc-45.1.0.jar com.sforce.ws.tools.wsdlc wsdl.xml enterprise.jar

java -classpath antlr-runtime-3.5.2.jar;tools.jar;st4-4.0.4.jar;force-wsc-45.1.0.jar com.sforce.ws.tools.wsdlc wsdl.jsp.xml partner.jar

java -classpath antlr-runtime-3.5.2.jar;tools.jar;st4-4.0.4.jar;force-wsc-45.1.0.jar com.sforce.ws.tools.wsdlc metadata.xml metadata.jar

3.創建程式並引用外部jar文件

創建java程式和引用jar外部包我就不解釋,要應用的jar就是上文生成的3個jar(enterprise.jar,metadata.jar,partner.jar),對,也要 force-wsc-45.1.0.jar

打開Eclipse創建一個JAVA項目,將上面說的四個jar包引進項目。

貼上介面程式碼,本例用的salesforce自帶的對象Accout

package com.yipan;

import com.sforce.soap.enterprise.Connector; import com.sforce.soap.enterprise.EnterpriseConnection; import com.sforce.soap.enterprise.QueryResult; import com.sforce.soap.enterprise.SaveResult; import com.sforce.soap.enterprise.sobject.Account;

import com.sforce.ws.ConnectionException; import com.sforce.ws.ConnectorConfig;

public class Test { static final String USERNAME = "YOUR-USERNAME"; //Salesforce帳號中的用戶名 static final String PASSWORD = "YOUR-PASSWORD&security token"; //密碼,這個密碼有點特殊,需要在密碼後面加入安全標記 static EnterpriseConnection connection;

public static void main(String[] args) {

ConnectorConfig config = new ConnectorConfig(); config.setUsername(USERNAME); config.setPassword(PASSWORD); try { connection = Connector.newConnection(config); System.out.println("Auth EndPoint: "+config.getAuthEndpoint()); System.out.println("Service EndPoint: "+config.getServiceEndpoint()); System.out.println("Username: "+config.getUsername()); System.out.println("SessionId: "+config.getSessionId());

// 增刪改查 queryContacts(); //createAccounts(); //updateAccounts(); //deleteAccounts(); } catch (ConnectionException e1) { e1.printStackTrace(); }

} // queries and displays the 5 newest contacts private static void queryContacts() { System.out.println("Querying for the 5 newest Account…"); try { // query for the 5 newest contacts //SELECT Id, FirstName, LastName, Account.Name " + "FROM Contact WHERE AccountId != NULL ORDER BY CreatedDate DESC LIMIT 5 QueryResult queryResults = connection.query("SELECT Id, Name,NumberOfEmployees FROM Account WHERE ID !=NULL ORDER BY CreatedDate DESC LIMIT 5"); if (queryResults.getSize() > 0) { for (int i=0;i<queryResults.getRecords().length;i++) { // cast the SObject to a strongly-typed Contact //Contact c = (Contact)queryResults.getRecords()[i]; Account c=(Account)queryResults.getRecords()[i]; System.out.println("Id: " + c.getId() + " – Name: "+c.getName()+"NumberOfEmployees: "+c.getNumberOfEmployees()); } } } catch (Exception e) { e.printStackTrace(); } } // create 5 test Accounts private static void createAccounts() { System.out.println("Creating 5 new test Accounts…"); Account[] records = new Account[2]; try { // create 5 test accounts for (int i=0;i<2;i++) { Account a = new Account(); a.setName("hello"+i); records[i] = a; } // create the records in Salesforce.com SaveResult[] saveResults = connection.create(records); // check the returned results for any errors for (int i=0; i< saveResults.length; i++) { if (saveResults[i].isSuccess()) { System.out.println(i+". Successfully created record – Id: " + saveResults[i].getId()); } else { com.sforce.soap.enterprise.Error[] errors = saveResults[i].getErrors(); for (int j=0; j< errors.length; j++) { System.out.println("ERROR creating record: " + errors[j].getMessage()); } } } } catch (Exception e) { e.printStackTrace(); } } // updates the 5 newly created Accounts private static void updateAccounts() { System.out.println("Update the 5 new test Accounts…"); Account[] records = new Account[5]; try { QueryResult queryResults = connection.query("SELECT Id, Name FROM Account ORDER BY " + "CreatedDate DESC LIMIT 5"); if (queryResults.getSize() > 0) { for (int i=0;i<queryResults.getRecords().length;i++) { // cast the SObject to a strongly-typed Account Account a = (Account)queryResults.getRecords()[i]; System.out.println("Updating Id: " + a.getId() + " – Name: "+a.getName()); // modify the name of the Account a.setName(a.getName()+" — UPDATED"); records[i] = a; } } // update the records in Salesforce.com SaveResult[] saveResults = connection.update(records); // check the returned results for any errors for (int i=0; i< saveResults.length; i++) { if (saveResults[i].isSuccess()) { System.out.println(i+". Successfully updated record – Id: " + saveResults[i].getId()); } else { com.sforce.soap.enterprise.Error[] errors = saveResults[i].getErrors(); for (int j=0; j< errors.length; j++) { System.out.println("ERROR updating record: " + errors[j].getMessage()); } } } } catch (Exception e) { e.printStackTrace(); } } // delete the 5 newly created Account private static void deleteAccounts() { System.out.println("Deleting the 5 new test Accounts…"); String[] ids = new String[5]; try { QueryResult queryResults = connection.query("SELECT Id, Name FROM Account ORDER BY " + "CreatedDate DESC LIMIT 5"); if (queryResults.getSize() > 0) { for (int i=0;i<queryResults.getRecords().length;i++) { // cast the SObject to a strongly-typed Account Account a = (Account)queryResults.getRecords()[i]; // add the Account Id to the array to be deleted ids[i] = a.getId(); System.out.println("Deleting Id: " + a.getId() + " – Name: "+a.getName()); } } // delete the records in Salesforce.com by passing an array of Ids com.sforce.soap.enterprise.DeleteResult[] deleteResults = connection.delete(ids); // check the results for any errors for (int i=0; i< deleteResults.length; i++) { if (deleteResults[i].isSuccess()) { System.out.println(i+". Successfully deleted record – Id: " + deleteResults[i].getId()); } else { com.sforce.soap.enterprise.Error[] errors = deleteResults[i].getErrors(); for (int j=0; j< errors.length; j++) { System.out.println("ERROR deleting record: " + errors[j].getMessage()); } } } } catch (Exception e) { e.printStackTrace(); } }

} 運行項目(在此截圖查詢的記錄,其它的都測試過了)

根據控制台ID可以去salesforce查詢到該客戶

如果需要用到新的對象,比如我自己創建的Position對象,那麼可以在對象的詳細頁面找到對象對應的api名稱,以及對象中欄位api名稱,如下圖

找到對應的api名稱後,如果需要創建一條Position紀錄,那麼可以這樣new一個對象 Position__c a = new Position__c(); 然後通過Set的擴展方法來對對象欄位的值進行賦值便可。