現在参画しているPrjでは、Salesforceと連携するシステムを作っているのですが、、、なぜか連携担当に任命されました orz 一番タフな所な気が…。
SalesforceのAPI、調べてみると色々な種類があるんですね。Salesforceのヘルプページに一覧が↓
どの API を使用すべきですか?
大きな分類では、REST APIかSOAP APIとあって、最近の流行りとしてはRESTだからなーとREST APIを調べていました。
が、RESTAPIだと外側からトランザクションの制御ができなさそう。SOAP APIだとAllOrNoneHeaderなるものがあってロールバックできました。
連携内容にもよりますが、今回の連携ではSalesforceの明細オブジェクトみたいなものを1トランザクションで複数insertする、みたいなのがあってロールバックは必須でした。
ということで、SOAP APIの採用へ。
今どきSOAPかぁ…とか思ったのですが、SOAP APIを実際に使ってみると使い勝手が良いです。Javaコード内でも普通のクラスと同様にSalesforceのオブジェクトを扱えて、ことSalesforce APIでいえば、RESTより楽なのでは…と思ったり。
ということで、SalesforceのSOAP API設定メモ。
1.Force.com Web Service Connector(WSC)の取得
SalesforceのSOAP APIをコールするクライアント実装としてForce.com Web Service Connector(WSC)なるものを使います。
github.com
とりあえずクローンして、手元でビルドしました。自分の場合、NetBeans使ってやりました。
force-wsc-35.2.0.jarとforce-wsc-35.2.0-uber.jarの明確な違いがよくわからないのですが…(ちなみに解凍してdiffとってもイマイチ。。)
GitHubのサンプルみるとforce-wsc-35.2.0-uber.jarのほうを使ってました。
2.Salesforce WSDL
Salesforceの環境からWSDLがダウンロードできるようになってます。
設定から「アプリケーションの設定」「開発」「API」を選びます。
今回はEnterprise WSDLを使いました。
前に何かで入れたアプリがでてますが、そのまま「Generate」を押します。
ブラウザでWSDLのxmlが表示されるので保存します。
3.SOAP API用のjarファイル生成
force-wsc-35.2.0-uber.jarをコマンドラインで叩いてSOAP API用のjarを生成します。
最初JDK8で試したら以下エラーとなりました。tools.jarないもんな…。
java -classpath force-wsc-35.2.0-uber.jar com.sforce.ws.tools.wsdlc wsdl.xml sfdc-enterprise-lib.jar
[WSC][wsdlc.main:71]Generating Java files from schema ...
[WSC][wsdlc.main:71]Generated 633 java files.
java.io.FileNotFoundException: C:\Program Files\Java\jre1.8.0_60\lib\tools.jar (
指定されたファイルが見つかりません。)
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(Unknown Source)
at java.util.zip.ZipFile.<init>(Unknown Source)
at java.util.jar.JarFile.<init>(Unknown Source)
at java.util.jar.JarFile.<init>(Unknown Source)
at com.sforce.ws.codegen.ToolsJarClassLoader.<init>(ToolsJarClassLoader.
java:52)
at com.sforce.ws.codegen.Compiler.findCompilerInToolsJar(Compiler.java:6
9)
at com.sforce.ws.codegen.Compiler.<init>(Compiler.java:57)
at com.sforce.ws.codegen.Generator.compileTypes(Generator.java:132)
at com.sforce.ws.tools.wsdlc.run(wsdlc.java:117)
at com.sforce.ws.tools.wsdlc.run(wsdlc.java:149)
at com.sforce.ws.tools.wsdlc.main(wsdlc.java:71)
Error: Unable to find compiler. Make sure that tools.jar is in your classpath: j
ava.io.FileNotFoundException: C:\Program Files\Java\jre1.8.0_60\lib\tools.jar (
指定されたファイルが見つかりません。)
ということで、JDK7で実行しました。
java -classpath force-wsc-35.2.0-uber.jar com.sforce.ws.tools.wsdlc wsdl.xml sfdc-enterprise-lib.jar
[WSC][wsdlc.main:71]Generating Java files from schema ...
[WSC][wsdlc.main:71]Generated 633 java files.
[WSC][wsdlc.main:71]Compiling to target 1.6...
警告:[options] ブートストラップ・クラスパスが-source 1.6と一緒に設定されていませ
ん
警告1個
[WSC][wsdlc.main:71]Compiled 636 java files.
[WSC][wsdlc.main:71]Generating jar file ... sfdc-enterprise-lib.jar
[WSC][wsdlc.main:71]Generated jar file sfdc-enterprise-lib.jar
Javaのコードから取引先を作成
jarができてしまえば、あとはコード書くだけです。
生成したjarだけじゃなく、force-wsc-35.2.0-uber.jarの参照も必要でした。
で、コードは
import com.sforce.soap.enterprise.Connector;
import com.sforce.soap.enterprise.EnterpriseConnection;
import com.sforce.soap.enterprise.SaveResult;
import com.sforce.soap.enterprise.sobject.Account;
import com.sforce.soap.enterprise.sobject.SObject;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;
public class SfdcSoapApiSample {
public static void main(String[] args) throws ConnectionException {
ConnectorConfig config = new ConnectorConfig();
config.setUsername("username");
config.setPassword("password");
EnterpriseConnection connection = Connector.newConnection(config);
Account account = new Account();
account.setName("20151106テスト取引先");
SaveResult[] ret = connection.create(new SObject[]{account});
}
}
Salesforce上に取引先ができてればOK。
ちなみに会社の後輩にはSOAP APIのドキュメントみながらやってもらったところ、wscのバージョンが23とかなってたっぽい(^^;けど動いたらしいのであまり変わらないのかも。
開発かなりタイトなのだけど、がんばろう(*´Д`)