現在参画しているPrjでは、Salesforceと連携するシステムを作っているのですが、、、なぜか連携担当に任命されました orz 一番タフな所な気が…。
SalesforceのAPI、調べてみると色々な種類があるんですね。Salesforceのヘルプページに一覧が↓
大きな分類では、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)なるものを使います。
とりあえずクローンして、手元でビルドしました。自分の場合、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; publicclass SfdcSoapApiSample { publicstaticvoid main(String[] args) throws ConnectionException { ConnectorConfig config = new ConnectorConfig(); config.setUsername("username"); //実際にはsandboxのログインアカウントを指定 config.setPassword("password"); //実際にはsandboxのログインパスワードを指定 EnterpriseConnection connection = Connector.newConnection(config); Account account = new Account(); account.setName("20151106テスト取引先"); SaveResult[] ret = connection.create(new SObject[]{account}); //retから情報取得したり } }
Salesforce上に取引先ができてればOK。
ちなみに会社の後輩にはSOAP APIのドキュメントみながらやってもらったところ、wscのバージョンが23とかなってたっぽい(^^;けど動いたらしいのであまり変わらないのかも。
開発かなりタイトなのだけど、がんばろう(*´Д`)