Salesforceに接続して、オブジェクト加工等を行うEclipseプロジェクトのテンプレート

Salesforceを使った案件をやっていると、通常のバッチ開発とは別に、「こういうことしたい」とか、「こんな情報を取得したい」といった要望が出てくることがよくあります。

対象が数件であれば手動で作業してもいいのですが、件数が多くなるとさすがにプログラムでやったほうが便利ですよね。

Salesforceとプログラムでやり取りするにはいくつかの方法があり、APIと呼ばれます。その主なものとしては、以下の2つがあります。

REST APIRESTベースのAPIです。サービス同士を比較的疎に接続でき、開発が容易なため、モバイルアプリやWebアプリからのCallで利用されることが多いと思います。
SOAP APISOAP形式のWebサービスベースのAPIです。SOAP API を使用して、レコードの検索、作成、更新、削除などができます。バッチシステムなどで利用されることが多いと思います。

ここでは、SOAP APIを利用して、Javaで開発を行うプロジェクトのひな形を作ります。

WSDLの用意

JavaからWebサービス経由でメソッドを呼びますので、WSDLファイルを用意します。これは、Salesforceの組織にログインして、「ビルド→開発→API」から取得します。いくつか種類がありますが、なるべく1つの組織に依存しないプロジェクトのひな形を作成するために、今回は「Partner WSDL」にしましょう。同ページに説明がありますが、「Enterprise WSDL」が強い型情報をもとに、カスタムオブジェクトのクラスまで生成するのに対して、「Partner WSDL」は比較的柔軟な定義です。

では、「パートナーWSDLの生成」をクリックして、「Partner WSDL」をダウンロードして来ましょう。

プロジェクトに必要なjarファイルの用意

上記で用意した「Partner WSDL」を 、どこか適当なディレクトリに置きます。(「partner.wsdl」という名前で保存しました。)

次に、「partner.wsdl」と同じディレクトリに、sfdc-wscからダウンロードした「wsc-xx.jar」を置きます。(今回はwsc-23.jar)

2つを配置できたら、コマンドプロンプトを起動し、そのディレクトリに移動して、以下のコマンドを打って実行します。

“C:\Program Files\Java\jdk1.7.0_79\bin\java” -classpath wsc-23.jar com.sforce.ws.tools.wsdlc partner.wsdl partner.jar

すると、「partner.jar」が生成されるはずです。

ちなみに、MetadataAPIを使ったり、APIが新しくなっているときは、

“C:\Program Files\Java\jdk1.7.0_79\bin\java” -classpath wsc-23.jar com.sforce.ws.tools.wsdlc metadata.wsdl metadata.jar

でjarを新しくしておきましょう。

2016年12月追記

上記で使っている「wsc-23.jar」は、おそろしく古いです。最近はVer38くらいにはなっているので、新規に追加されたオブジェクトも多く、最新のwscを自分でコンパイルして使うことをお勧めします。その方法については、新たに記事を書きましたので、そちら(Salesforceの最新APIのWSC(Web Service Connector)のjarファイルをコンパイルして使用する)を参考にしてください。

プロジェクトの作成

ここまで来たら、用意はできました。Eclipseで新規Javaプロジェクトを作成してください。

上記の「wsc-XX.jar」と「partner.jar」をclasspathに入れれば、以下のひな形ソースがコンパイルできるはずです。

import com.sforce.soap.partner.Connector;
import com.sforce.soap.partner.DeleteResult;
import com.sforce.soap.partner.PartnerConnection;
import com.sforce.soap.partner.QueryResult;
import com.sforce.soap.partner.SaveResult;
import com.sforce.soap.partner.Error;
import com.sforce.soap.partner.sobject.SObject;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;
 
public class Main {
   
  static final String USERNAME = "YOUR-USERNAME";
  static final String PASSWORD = "YOUR-PASSWORD&SECURITY-TOKEN";
  static PartnerConnection connection;
 
  public static void main(String[] args) {
 
    ConnectorConfig config = new ConnectorConfig();
    config.setUsername(USERNAME);
    config.setPassword(PASSWORD);
  //本番かSandboxかで向き先を切り替えてください。
  config.setAuthEndpoint(ENDPOINT);
    config.setTraceMessage(true);
    //proxy経由で接続するなら、下記をコメントアウトしてください。
    //config.setProxy("xxxxxxxxxx", 8888);
 
    try {
       
      connection = Connector.newConnection(config);
       
      // display some current settings
      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();
       
    } catch (ConnectionException e1) {
        e1.printStackTrace();
    }  
 
  }
   
  private static void queryContacts() {
     
    System.out.println("Querying for the 5 newest Contacts...");
     
    try {
        
      QueryResult queryResults = connection.query("SELECT Id, FirstName, LastName, Account.Name " +
              "FROM Contact WHERE AccountId != NULL ORDER BY CreatedDate DESC LIMIT 5");
      if (queryResults.getSize() > 0) {
          for (SObject s: queryResults.getRecords()) {
            System.out.println("Id: " + s.getId() + " " + s.getField("FirstName") + " " + 
                s.getField("LastName") + " - " + s.getChild("Account").getField("Name"));
          }
        }
       
    } catch (Exception e) {
      e.printStackTrace();
    }    
     
  }
   
  
}

それでは、次回からは、このひな形を使って、具体的なバッチ加工を行っていきましょう。

参考URL: developer.salesforce.comの「Introduction to the Force.com Web Services Connector」