BlueMix でアプリケーションを作ると、データベースなどのサービス環境に接続するための情報を VCAP_SERVICES という変数から取得する必要があります。アプリケーションを Java で開発する場合に、これを具体的にどうやって実現するか、というサンプルを紹介します。
まず、これは Java で開発する場合だけでなく、全ての言語で言えることですが、BlueMix のアプリケーションサーバーにバインドされたサービスの情報は VCAP_SERVICES という環境変数から取得することになります。例えば MySQL サービスとバインドしていると、VCAP_SERVICES 変数には以下のような内容の JSON 文字列が追加されます:
問題は Java で JSON を扱うのが意外と面倒、ということです。JSON は JavaScript 用のオブジェクト形式ですが、Java と JavaScript の親和性がいいとは思えないくらいに扱いが難しいのでした。
とりあえず、サンプルとしてシンプルな JSON ライブラリである JSON simple を使って実装してみます:

json-simple - A simple java toolkit for JSON
これをダウンロードして jar をプロジェクトにインポートした上で、こんな感じのコードを実装することになります:
でもまだちと面倒だよなあ・・・ もう少し可読性よく書きたいんだけど、Java だと JSON は本当に厄介です。
まず、これは Java で開発する場合だけでなく、全ての言語で言えることですが、BlueMix のアプリケーションサーバーにバインドされたサービスの情報は VCAP_SERVICES という環境変数から取得することになります。例えば MySQL サービスとバインドしていると、VCAP_SERVICES 変数には以下のような内容の JSON 文字列が追加されます:
ここから接続に必要な値を取り出して接続することになります。Java 言語で JDBC を使うのであれば、赤字に相当する部分を取り出して、以下の様な処理を実行することでコネクションを取得することができます(別途 MySQL 用の JDBC ドライバを用意しておく必要があります):"mysql-5.5": [ { "name": "mysql-scsrh", "label": "mysql-5.5", "plan": "100", "credentials": { "name": "(データベース名)", "hostname": "XX.XXX.XX.XXX", "host": "XX.XXX.XX.XXX", "port": 3307, "user": "(接続ユーザー名)", "username": "(接続ユーザー名)", "password": "(接続パスワード)", "uri": "mysql://(接続ユーザ名):(接続パスワード)@XX.XXX.XX.XXX:3307/(データベース名)" } } ]
MySQL に限らず DB2 や MongoDB、Twilio などでも同様です。接続情報が必要かどうかはともかくとして、バインドされたサービスに関する設定情報は VCAP_SERVICES 環境変数の中に JSON 形式で格納されるので、そこから必要な情報を取り出して利用する、という流れになります。try{ Class.forName( "com.mysql.jdbc.Driver" ); Connection conn = DriverManager.getConnection( "jdbc:" + "mysql://XX.XXX.XX.XXX:3307/(データベース名)", "(接続ユーザ名)", "(接続パスワード)" ); : }catch( Exception e ){ e.printStackTrace(); }
問題は Java で JSON を扱うのが意外と面倒、ということです。JSON は JavaScript 用のオブジェクト形式ですが、Java と JavaScript の親和性がいいとは思えないくらいに扱いが難しいのでした。
とりあえず、サンプルとしてシンプルな JSON ライブラリである JSON simple を使って実装してみます:

json-simple - A simple java toolkit for JSON
これをダウンロードして jar をプロジェクトにインポートした上で、こんな感じのコードを実装することになります:
import org.json.simple.*;
import org.json.simple.parse.*;
import java.sql.*;
:
:
Connection conn = null;
String vcap = System.getenv( "VCAP_SERVICES" );
if( vcap != null ){
//. 環境変数 VCAP_SERVICES をデコード JSONParser parser = new JSONParser(); Object obj = parser.parse( vcap ); JSONObject json = ( JSONObject )obj;
//. mysql5-5 の credentials 以下のみを取り出す
JSONObject credentials = ( JSONObject )( ( JSONObject )( ( JSONArray )json.get( "mysql-5.5" ) ).get( 0 ) ).get( "credentials" );
//. 上記赤字部分の情報を取り出す
String name = ( String )credentials.get( "name" );
String hostname = ( String )credentials.get( "hostname" );
Integer port = ( Integer )credentials.get( "port" );
String username = ( String )credentials.get( "username" );
String password = ( String )credentials.get( "password" );
//. コネクション取得
try{
Class.forName( "com.mysql.jdbc.Driver" );
conn = DriverManager.getConnection( "jdbc:mysql://" + hostname + ":" + port + "/" + name, username, password );
}catch( Exception e ){
e.printStackTrace();
}
}
:
:
でもまだちと面倒だよなあ・・・ もう少し可読性よく書きたいんだけど、Java だと JSON は本当に厄介です。