SalesForceのオブジェクトをJavaのAPIで取得し、csvに出力する手順 – その②
前回の記事(SalesForceのオブジェクトをJavaのAPIで取得し、csvに出力する手順 – その①)で、自組織の情報をもとに、Javaのクラス(スタブ)ファイルを自動生成するところまでを行いました。
Eclipseのプロジェクトに、「com.sforce.enterprise」パッケージが生成されていることが確認できると思います。
今回はそのパッケージを使用して、SalesForceへの接続と、データの取得を行い、csvファイルに書き出すところまでを行いたいと思います。
まずはじめに、SalesForceに接続する役割を担うクラスを作成しましょう。
package jp.koji; import java.io.IOException; import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; import com.sforce.soap.enterprise.LoginResult; import com.sforce.soap.enterprise.SessionHeader; import com.sforce.soap.enterprise.SforceServiceLocator; import com.sforce.soap.enterprise.SoapBindingStub; public class SfdcSession { /** ユーザーID */ private String uid = null; /** ユーザーパスワード */ private String pwd = null; /** エンドポイント */ private String endpoint = null; /** セールフォースのセッションクラス */ private static SfdcSession currentSession = null; /** SoapBindingStubクラス */ public SoapBindingStub binding = null; /** LoginResultクラス */ private LoginResult lr = null; /** セッションヘッダクラス */ private SessionHeader sh = null; public SfdcSession(String uid, String pwd, String endpoint) { this.uid = uid; this.pwd = pwd; this.endpoint = endpoint; } public static SfdcSession openSession(String uid, String pwd, String endpoint) throws IOException { currentSession = new SfdcSession(uid, pwd, endpoint); currentSession.close(); currentSession.connect(); return currentSession; } public void connect() throws IOException { // SOARBinding生成 try { SforceServiceLocator sfl = new SforceServiceLocator(); sfl.setSoapEndpointAddress(endpoint.trim()); binding = (SoapBindingStub)sfl.getSoap(); } catch (ServiceException e) { throw new IOException("SFDCへの接続失敗"); } // ログイン lr = binding.login(this.uid, this.pwd); // エンドポイントURLセット binding._setProperty(SoapBindingStub.ENDPOINT_ADDRESS_PROPERTY, lr.getServerUrl()); // セッションヘッダ作成 sh = new SessionHeader(); sh.setSessionId(lr.getSessionId()); // セッションヘッダをセット binding.setHeader(new SforceServiceLocator().getServiceName().getNamespaceURI(), SessionHeader, sh); } /** * ログアウト * */ public void close() { if (binding != null) { try { binding.logout(); } catch (RemoteException e) { e.printStackTrace(); } finally { binding = null; } } } /** * タイムアウト時間設定 * * @param timeout タイムアウト時間 */ public void setTimeOut(int timeout) { binding.setTimeout(timeout); } }
次に、そのクラスを利用して、実際にSalesForceに接続し、「Brand__c」というSobjectのデータを取得、csvに書き出してみます。「Brand__c」は私がSalesForce上に作成したカスタムオブジェクトです。
SalesForce上のオブジェクトは「SObject」を継承したクラスとして自動生成されます。
上記のように、「com.sforce.soap.enterprise.sobject」を見ると、Java側で利用できるObjectが確認できます。
セッションを確立したら、SOQLによりオブジェクト情報を取得し、それをそれぞれのSobjectを継承したクラスにセットするというのがJavaのAPIでSalesForce情報を取得する流れになります。
試しに、「Brand__c」クラスの定義を見てみてみます。
public class Brand__c extends com.sforce.soap.enterprise.sobject.SObject implements java.io.Serializable
となっています。
package jp.koji; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.sforce.soap.enterprise.QueryResult; import com.sforce.soap.enterprise.sobject.Brand__c; import com.sforce.soap.enterprise.sobject.SObject; public class SfdcConTest { private static String SFDC_USER_ID = "userid"; private static String SFDC_PASSWORD = "password"; private static String SFDC_END_POINT = "https://login.salesforce.com/services/Soap/c/21.0/0DF10000000TSF7"; public static void main(String[] args) { SfdcSession sfdcSession = null; try{ System.setProperty("http.proxyHost", "xxxxxxxxxx.co.jp"); System.setProperty("http.proxyPort", "8080"); // セールスフォースへのセッションを作成 sfdcSession = SfdcSession.openSession( SFDC_USER_ID, SFDC_PASSWORD, SFDC_END_POINT); // タイムアウト時間設定 sfdcSession.setTimeOut(600000); List<Brand__c> objectList = new ArrayList<Brand__c>(); // SOQLの作成 StringBuffer selectQuery = new StringBuffer(); selectQuery.append("SELECT "); selectQuery.append("Id, "); selectQuery.append("Name "); selectQuery.append("FROM "); selectQuery.append("Brand__c "); selectQuery.append("where IsDeleted = false "); // クエリ実行 QueryResult rs = sfdcSession.binding.query(selectQuery.toString()); // 検索結果の取得 boolean done = false; if (rs.getSize() > 0){ while (!done) { for (SObject so : rs.getRecords()) { objectList.add((Brand__c)so); } // 取得件数が多い場合は再検索をおこなう if (rs.isDone()) { done = true; } else { rs = sfdcSession.binding.queryMore(rs.getQueryLocator()); } } } File csv = new File("writers.csv"); // CSVデータファイル // 追記モード BufferedWriter bw = new BufferedWriter(new FileWriter(csv, true)); Iterator<Brand__c> iter = objectList.iterator(); while(iter.hasNext()) { Brand__c _sb = iter.next(); bw.write(_sb.getId() + "," + _sb.getName()); bw.newLine(); } bw.close(); }catch(Exception e){ e.printStackTrace(); } } }
この2行はProxy経由でSalesForceに接続するための設定です。経由しない場合は、コメントアウトしてください。
System.setProperty("http.proxyHost", "xxxxxxxxxx.co.jp");
System.setProperty("http.proxyPort", "8080");
SalesForceにログインする時のパスワードは、通常、「ログインパスワード+パスフレーズ」の形式です。
パスフレーズなしでJavaプログラムからログインさせるには、「セキュリティトークンのリセットとパスフレーズの設定について」の記事を参考にしてください。
SalesForceでは文字コードはUTF-8となっています。そのため、csvファイルに書き出しを行うとUTF-8でファイルが作成されます。
エクセル等で開いて文字化けする場合には、文字コードを確認してください。
コラム
salesforce関連の本って少ないですよね。また、Web上の情報は詳しいのですが、広大すぎて、調べようと思ったときに手元にリファレンス的な本があると助かります。以下は私のおすすめの本です。
Force.comのすべて ~設計・開発 実践マニュアル~ 初めてSalesForceでWebアプリを作ろうとしたとき、どこから手を付けていいか迷いました。そんなときに役立つ初心者向けの本です。細かいところに手が届くたぐいの本ではないですが、一通り、体系的に学べるので、役に立ちます。
改訂新版 Salesforceプログラミングバイブル すこし高い本ですが、豊富なソースが載っており、上の本を勉強して次の段階に進んだ技術者には役立。こんなことってSalesForceでできないの?と思ったときにも役に立ちます。
タグ:java, Salesforce