読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

SalesforceのSOAP APIをJavaから呼び出す

Salesforce SOAP

現在参画している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使ってやりました。

f:id:kikutaro777:20151106214808j:plain

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」を選びます。
f:id:kikutaro777:20151107100027j:plain

今回はEnterprise WSDLを使いました。
f:id:kikutaro777:20151107100119j:plain

前に何かで入れたアプリがでてますが、そのまま「Generate」を押します。
f:id:kikutaro777:20151107100637j:plain

ブラウザでWSDLのxmlが表示されるので保存します。
f:id:kikutaro777:20151107100647j:plain

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"); //実際には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。

f:id:kikutaro777:20151107115325j:plain

ちなみに会社の後輩にはSOAP APIのドキュメントみながらやってもらったところ、wscのバージョンが23とかなってたっぽい(^^;けど動いたらしいのであまり変わらないのかも。

開発かなりタイトなのだけど、がんばろう(*´Д`)

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村