Salesforce App Cloud Advent Calendar 2015の13日目の記事ということでSalesforceのSOAP APIをつかったJavaアプリ開発について投稿したいと思います。
はじめに
デモ動画
Salesforce APIでこんな感じのアプリをつくれます。

Heroku Demo #12 - Java × Salesforce SOAP API ver.1
https://www.youtube.com/watch?v=vI8BniQhmWY
サンプルコード
サンプルコードです。Herokuボタンも配置したのでクリックして自分のHeroku環境で動かしてみることができると思います。

tyoshikawa1106/java-salesforce-soap-api
https://github.com/tyoshikawa1106/java-salesforce-soap-api
Force.com Web Service Connector (WSC)の準備
JavaからSalesforceAPIを実行するにはForce.com Web Service Connectorを用意する必要があります。

forcedotcom/wsc
https://github.com/forcedotcom/wsc
Building WSC
git cloneコマンドで必要なファイルをダウンロードします。
git clone https://github.com/forcedotcom/wsc.git
 
wscフォルダをダウンロードしたら次のコマンドでビルドします。
cd wsc
mvn clean package -Dgpg.skip
 
実行時にいくつかWarningが表示されるかもしれませんが、ひとまず問題ありませんでした。これでビルドが完了してwscフォルダに必要なファイルが用意されました。
 
次はPartnerWSDLを取得します。Salesforce組織にログインして設定→開発→APIを選択してください。API WSDLのページが表示されます。『パートナー WSDL の生成』リンクから取得することが可能です。

右クリックのリンク先を別名で保存という感じでダウンロードできると思います。

これでParterWSDLの取得も完了しました。『force-wsc-36.0.0.jar』と『partner.wsdl』を利用して『partner.jar』を生成します。
次のコマンドを実行すると『partner.jar』ファイルが生成されます。
java -classpath target/force-wsc-36.0.0-uber.jar com.sforce.ws.tools.wsdlc partner.wsdl partner.jar
 
JavaのプロジェクトにPartner.jarファイルとforce-wsc-36.0.0.jarファイルを読みこませることでSaleforce APIが利用できます。
Javaアプリの開発 (Spring Boot)
プロジェクトの雛形作成
次のコマンドでJavaプロジェクトの雛形を作成できます。
mvn -B archetype:generate -DgroupId=com.example -DartifactId=SalesforceApiApp -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart
プロジェクトにJarファイルの追加
ここはイマイチ理解できてないのですが、次の手順で追加できました。
- src / main / resources / libフォルダを作成
- force-wsc-36.0.0.jarとpartner.jarを格納する
 
pom.xmlを編集
dependencyタグにresources/libフォルダに追加したforce-wsc-36.0.0.jarとpartner.jarを宣言します。
 
pom.xmlの全体はこんな感じです。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>SalesforceApiApp</artifactId>
  <packaging>jar</packaging>
  <version>1.0.0-SNAPSHOT</version>
  <name>SalesforceApiApp</name>
  
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.RELEASE</version>
  </parent>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-core-asl</artifactId>
      <version>1.9.4</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.4</version>
    </dependency>
    
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.14.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.sforce.soap.partner</groupId>
      <artifactId>partner</artifactId>
      <version>1.0</version>
      <scope>system</scope>
      <systemPath>${basedir}/src/main/resources/lib/partner.jar</systemPath>
    </dependency>
    <dependency>
      <groupId>com.force.api</groupId>
      <artifactId>force-wsc</artifactId>
      <version>1.0</version>
      <scope>system</scope>
      <systemPath>${basedir}/src/main/resources/lib/force-wsc-36.0.0.jar</systemPath>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <dependencies>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
            <version>1.2.5.RELEASE</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
  <properties>
    <java.version>1.8</java.version>
  </properties>
</project>
testフォルダにはJavaのテストを行うためのファイル一式が用意されていますが今回はそこまでやらないので削除して進めます。

Spring BootのHello World
pom.xmlの準備ができたら次のコマンドで実行できます。Hello Worldと表示されると思います。
cd SalesforceApiApp
mvn spring-boot:run
STS(Spring Tool Suite)でプロジェクトをインポート
Spring Bootの開発にはSTS(Spring Tool Suite)が便利です。STSはEclipseベースの開発ツールです。
 
Spring Tool Suite™
https://spring.io/tools
Existing Maven Projectsを選択してNextボタンをクリックします。

Root Directoryにプロジェクトのパスを指定します。Browseボタンでフォルダを指定できます。

pom.xmlにチェックがついていることを確認してFinishボタンをクリックします。

Webページの表示
実際にWebページ上でHello Worldを表示してみたいと思います。thymeleafを利用します。
 >Tutorial: Using Thymeleaf (ja)
>http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html
>Tutorial: Using Thymeleaf (ja)
>http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html
App.javaを次のように変更します。
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
@EnableAutoConfiguration
@ComponentScan
public class App {
  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }
}
内容は次のような感じです。
package com.example.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class SalesforceApiController {
    /**
     * Home Page【GET】
     * @return
     */
    @RequestMapping(value="/", method=RequestMethod.GET)
    public String showHome() {
        return "home";
    }
}
HTMLを用意します。(resourcesフォルダ内にtemplatesフォルダを作成。その中にhome.htmlを用意します。)
<html lang="jp">
    <head>
        <title>Home</title>
    </head>
    <body>
        <div id="main">
            <h1>Hello World!!</h1>
        </div>
    </body>
</html>
ここまで準備ができたらApp.javaを右クリックしてRun AsのSpring Boot Appを選択します。

localhost:8080にアクセスするとhome.htmlの内容を表示できると思います。

これでSTSにプロジェクトをインポートするところからJava Spring BootでHTMLとControllerを用意するまでの流れを確認できました。
Salesforce APIの解説
Java Spring BootをつかったHello Worldの表示まで確認できたところでSalesforce APIの使い方を確認したいと思います。
Salesforceへのログイン
Salesforce SOAP APIをつかってログインする場合は『ConnectorConfig』にユーザID、パスワード、authEndpointをセットして『PartnerConnection』をnewする感じでログインできます。
public ConnectorConfig getConnectorConfig(String userId, String password, String authEndpoint) throws ConnectionException, AsyncApiException {
      ConnectorConfig partnerConfig = new ConnectorConfig();
      partnerConfig.setUsername(userId);
      partnerConfig.setPassword(password);
      partnerConfig.setAuthEndpoint(authEndpoint);
      new PartnerConnection(partnerConfig);
      return partnerConfig;
}
この処理を利用する際に以下のImportが必要になります。
import com.sforce.async.AsyncApiException;
import com.sforce.soap.partner.PartnerConnection;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;
authEndpointにセットするURLは次のようになります。
// Product またはDev環境
https://login.salesforce.com/services/Soap/u/35.0
// Sandbox環境
https://test.salesforce.com/services/Soap/u/35.0
ConnectorConfigではSetした『userName』や『password』などをGetする関数も用意されています。またログイン時の『SesstionID』もここから取得できます。

PartnerConnectionでは『getUserInfo』でログインしたユーザの情報を取得したりlogin(), logoutの関数などが用意されています。

クエリの実行
SOAP APIではpartnerConnectionを使って次のようにクエリを実行できます。
// 取引先(Account)取得クエリの作成
String soqlQuery = "SELECT Name, AccountNumber FROM Account ORDER BY Name ASC LIMIT 200";
// クエリの実行
QueryResult qr = partnerConnection.query(soqlQuery);
// 実行結果の取得
SObject[] records = qr.getRecords();
またAccountやContactなどのsObject型変数も宣言できました。
Account acc = new Account();
Object accountName = records[i].getField("Name");
if (accountName != null) {
    acc.setName(String.valueOf(accountName));
} else {
    acc.setName("");
}
この辺りの処理を組み合わせていけばSalesforceにログインしてクエリを実行して取引先一覧を表示するところまで動かしてみることができると思います。
Herokuデプロイについて
Herokuにデプロイするときは『Procfile』ファイルと『system.properties』ファイルを用意する必要があります。
web: java $JAVA_OPTS -jar target/*.jar --server.port=$PORT
java.runtime.version=1.8
詳細はこちらにまとめてあります。
Java:Spring BootアプリのHerokuデプロイを試してみました
http://tyoshikawa1106.hatenablog.com/entry/2015/11/26/210000
まとめ
ちょっと長くなりましたが、Java Spring BootとSalesforce SOAP APIをつかったアプリ開発はこんな感じで始めることができます。
SalesforceのSOAP APIについての詳細はDeveloper Guideを確認してください。

SOAP API 開発者ガイド
https://developer.salesforce.com/docs/atlas.ja-jp.196.0.api.meta/api/









