SOAP APIのJavaクライアントには、色々なライブラリがあります。それぞれのJavaライブラリでSalesforce APIを使ってみた結果をまとめてみます。
サマリ
Java ライブラリ | SOAP API | Metadata API | xsd:intにバインドされる型 | XML中の不正な制御コード | データバインディングの性能 | |
---|---|---|---|---|---|---|
Axis1.4 | ○ | × | Integer | エラー | 普通 | |
Axis2 | adb | × | × | Integer | エラー | - |
xmlbeans | ○ | ○ | int(対応するboolean変数で値がセットされたかどうかは判定可能) | エラー | やや早い | |
wsimport | ○ | ○ | Integer | エラー | 普通 | |
apache cxf | ○ | ○ | Integer | やや遅い | ||
wsc | ○ | ○ | int(対応するbooleanで値がセットされたかどうか判定可能だが、変数がprivateであり値を取得するためにリフレクションが必要) | 除去する | やや早い |
比較軸について
- SOAP API、METADATA APIが使えるかどうかにしました。”○”が対応していて、”×”が対応していません。
また、SOAP APIはパートナーWSDLを対象としています。 - xsd:intをJavaコードにした際にバインドされるクラスを書きました。理由は、xsd:int の値でSalesforceからnullが返却される時があるからです。
Java側でIntegerではなくintでうけると、nullは0となります。nullに意味がある場合は注意が必要となります。 - データバインディングの性能を記載しました。300項目、300行を返却するSOQLをqueryし、結果を取得するまでかかった時間で測定しています。各ライブラリで計測した時間は次の通りでした。apache cxfがやや遅いです。
Java ライブラリ | 1回目(ms) | 2回目(ms) | 3回目(ms) | 平均(ms) |
---|---|---|---|---|
axis1.4 | 5726 | 5196 | 5165 | 5362.33 |
aixs2(xmlbeans) | 5054 | 4212 | 4571 | 4612.33 |
wsimport | 5928 | 6037 | 5819 | 5928 |
apache cxf | 7572 | 7894 | 7474 | 7646.67 |
wsc | 4181 | 4508 | 4358 | 4349 |
実行環境:
java : jdk8 32bit u121
axis1.4 : axis1.4_7 , commons-httpclient-3.1
wsimport : version 2.2.9 , JAXWS2.2.7
apache cxf : 2.7.18
wsc : force-wsc-27.0.0.jar , gson-2.8.0.jar , rhino-1.7.7.1.jar
java : jdk8 32bit u121
axis1.4 : axis1.4_7 , commons-httpclient-3.1
wsimport : version 2.2.9 , JAXWS2.2.7
apache cxf : 2.7.18
wsc : force-wsc-27.0.0.jar , gson-2.8.0.jar , rhino-1.7.7.1.jar
Axis1.4
- 古いけど、使いやすいです。(特にSObject型が扱い易いです。queryの結果や、insert/upsert/updateでSObjectを使う際に扱い易さが実感できます)
- 残念なことにMetadataAPIをJavaクラスに変換するとエラーが出るようになってしまいました。(APIVer32までは問題なく変換できていました)。
- 「Accept-Encoding: gzip 」を使うためには、commons http3.Xが必要です。Commons http3.Xをclasspathに含めて、client-config.wsddファイルで、transportをCommonsHTTPSenderに変更します。
Axis2
- Axis2には、JavaClientを作る方法が複数あって、adbとxmlbeansを記載しました。(他にもjaxbriというのがありましたが、SOAP APIのコードジェネレータでエラーが発生してしまい解決できませんでした。)
- adbはwsdlのextensionが対応してなくて両方×でした。
- Axis2のxmlbeansは、コードジェネレータでjavaコードとxsbという拡張子のバイナリファイルが出力されます。そのxsbファイルも実行時に必要となります。
- Axis2のxmlbeansでコードを生成すると、細かく制御ができるのですが、コード量が他に比べて圧倒的に多くなります。
wsimport
- Jdkに標準ではいっているコードジェネレータコマンド
- Webサービスコールの初回で、wsdlファイルを探しに行ったり、標準のままではエンドポイントを変更できなかったりします。
- 上記のようにwsdlを探しにいくので、salesforceの場合は、jarにwsdlを含めておく必要があります。
- 標準のままではエンドポイントを変更できないので、 (https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-rt)から追加のライブラリを入手が必要です。
apache cxf
- jaxbやxmlbeansがデータバインディングに使えます。
- 細かくオプションが用意されていて使いやすい(んだと思います)。
- wsimportと同様にwsdlを探しにいくので、salesforceの場合は、jarにwsdlを含めておく必要があります。
- apache cxf2.7とapache cxf3.1を比較すると、cxf3.1の方がデータバインディングがかなり遅くなるので、cxf2.7がおすすめです。
wsc (Force.com Web Services Connector)
- salesforceのWebServive用のコードジェネレータ、現時点ではスタンダードなライブラリで、Salesforceのヘルプサイトのサンプルコードもこのライブラリで書かれています。
- 色々な所で工夫されていてコード量が少なくてすみます。
例えば、login後に、エンドポイントの変更や、セッションIDのセットを自動で行ってくれたりします。 - データの登録(insert,upsert,update)の際に、partner.wsdlであってもクライアント側で項目の型とセットする型をチェックしてくれます。項目の型とセットする型は次のチェックです。
日付型:java.util.Calendar
日付/時間型:java.util.Calendar
チェックボックス型:java.lang.Boolean
int型:java.lang.Integer
base64型:byte[] - xsd:intがJavaのプリミティブintにバインドされますが、nullだったかどうかが通常では判断できません。(private変数に{フィールド名}__is_setがあり、値がセットされたかは判断できるので、リフレクションを使うことで判断はできますが、無理矢理なやり方だと思います)
次回からそれぞれについて、細かくコードを紹介したいと思います。
補足
各ライブラリでのSalesforceへレコードを作成・更新する際のSobjectへの項目値の指定の仕方は次の記事に書きました。
crmprogrammer38.hatenablog.com