Java Spring Boot × Salesforce SOAP API

  • 5
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Salesforce App Cloud Advent Calendar 2015の13日目の記事ということでSalesforceのSOAP APIをつかったJavaアプリ開発について投稿したいと思います。

はじめに

デモ動画

Salesforce APIでこんな感じのアプリをつくれます。
IMAGE ALT Heroku Demo #12 - Java × Salesforce SOAP API ver.1

Heroku Demo #12 - Java × Salesforce SOAP API ver.1
https://www.youtube.com/watch?v=vI8BniQhmWY

サンプルコード

サンプルコードです。Herokuボタンも配置したのでクリックして自分のHeroku環境で動かしてみることができると思います。
スクリーンショット 2015-12-12 16.10.55.png

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を用意する必要があります。
スクリーンショット 2015-12-13 11.38.52.png

forcedotcom/wsc
https://github.com/forcedotcom/wsc

Building WSC

git cloneコマンドで必要なファイルをダウンロードします。

git clone https://github.com/forcedotcom/wsc.git

スクリーンショット 2015-12-12 16.25.33.png

wscフォルダをダウンロードしたら次のコマンドでビルドします。

cd wsc
mvn clean package -Dgpg.skip

スクリーンショット 2015-12-12 16.29.46.png

実行時にいくつかWarningが表示されるかもしれませんが、ひとまず問題ありませんでした。これでビルドが完了してwscフォルダに必要なファイルが用意されました。

スクリーンショット 2015-12-12 16.31.46.png

次はPartnerWSDLを取得します。Salesforce組織にログインして設定→開発→APIを選択してください。API WSDLのページが表示されます。『パートナー WSDL の生成』リンクから取得することが可能です。
スクリーンショット 2015-12-12 16.34.08.png

右クリックのリンク先を別名で保存という感じでダウンロードできると思います。
スクリーンショット 2015-12-12 16.37.23.png

これでParterWSDLの取得も完了しました。『force-wsc-36.0.0.jar』と『partner.wsdl』を利用して『partner.jar』を生成します。

wscフォルダ内に次のように配置してください。
スクリーンショット 2015-12-12 16.39.08.png

次のコマンドを実行すると『partner.jar』ファイルが生成されます。

java -classpath target/force-wsc-36.0.0-uber.jar com.sforce.ws.tools.wsdlc partner.wsdl partner.jar

スクリーンショット 2015-12-12 16.49.31.png

これでPartner.jarファイルの準備も完了しました。
スクリーンショット 2015-12-12 16.52.32.png

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

スクリーンショット 2015-12-12 22.27.44.png

次のようなファイルが生成されます。
スクリーンショット 2015-12-12 22.28.43.png

プロジェクトにJarファイルの追加

ここはイマイチ理解できてないのですが、次の手順で追加できました。

  1. src / main / resources / libフォルダを作成
  2. force-wsc-36.0.0.jarとpartner.jarを格納する

スクリーンショット 2015-12-12 22.38.24.png

pom.xmlを編集

dependencyタグにresources/libフォルダに追加したforce-wsc-36.0.0.jarとpartner.jarを宣言します。

スクリーンショット 2015-12-12 22.53.12.png

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のテストを行うためのファイル一式が用意されていますが今回はそこまでやらないので削除して進めます。
スクリーンショット 2015-12-12 23.33.43.png

Spring BootのHello World

pom.xmlの準備ができたら次のコマンドで実行できます。Hello Worldと表示されると思います。

cd SalesforceApiApp
mvn spring-boot:run

スクリーンショット 2015-12-12 23.40.13.png

STS(Spring Tool Suite)でプロジェクトをインポート

Spring Bootの開発にはSTS(Spring Tool Suite)が便利です。STSはEclipseベースの開発ツールです。

スクリーンショット 2015-12-13 11.40.45.png

Spring Tool Suite™
https://spring.io/tools

起動した後はまずWorkspaceのパスを指定します。
スクリーンショット 2015-12-12 22.59.40.png

これでSTSの使用準備ができました。
スクリーンショット 2015-12-12 23.01.04.png

右クリックでメニューを表示してImportを選択します。
スクリーンショット 2015-12-12 23.07.02.png

Existing Maven Projectsを選択してNextボタンをクリックします。
スクリーンショット 2015-12-12 23.08.41.png

Root Directoryにプロジェクトのパスを指定します。Browseボタンでフォルダを指定できます。
スクリーンショット 2015-12-12 23.23.18.png

pom.xmlにチェックがついていることを確認してFinishボタンをクリックします。
スクリーンショット 2015-12-12 23.25.56.png

これでJava開発の準備ができました。
スクリーンショット 2015-12-12 23.44.41.png

Webページの表示

実際にWebページ上でHello Worldを表示してみたいと思います。thymeleafを利用します。

スクリーンショット 2015-12-13 11.43.35.png

Tutorial: Using Thymeleaf (ja)
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html

App.javaを次のように変更します。

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);
  }
}

Controllerを作成します。
スクリーンショット 2015-12-13 10.02.00.png

内容は次のような感じです。

SalesforceApiController.java
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を用意します。)

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を選択します。
スクリーンショット 2015-12-13 10.14.57.png

localhost:8080にアクセスするとhome.htmlの内容を表示できると思います。
スクリーンショット 2015-12-13 10.18.07.png

これで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』もここから取得できます。
スクリーンショット 2015-12-13 10.45.04.png

PartnerConnectionでは『getUserInfo』でログインしたユーザの情報を取得したりlogin(), logoutの関数などが用意されています。
スクリーンショット 2015-12-13 10.48.52.png

クエリの実行

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』ファイルを用意する必要があります。

Procfile
web: java $JAVA_OPTS -jar target/*.jar --server.port=$PORT
system.properties
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を確認してください。
スクリーンショット 2015-12-13 11.03.30.png

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