Java アダプター

improve this page | report issue

概説

Java アダプターは、JAX-RS 2.0 仕様に基づいています。 言い換えれば、Java アダプターは、MobileFirst Server インスタンスに容易にデプロイでき、MobileFirst Server API およびその他のサード・パーティー API にアクセスできる JAX-RS 2.0 サービスです。

前提条件: 最初に必ず、Java アダプターおよび JavaScript アダプターの作成チュートリアルをお読みください。

ジャンプ先

ファイル構造

mvn-adapter

adapter-resources フォルダー

adapter-resources フォルダーには、XML 構成ファイル (adapter.xml) が含まれています。 この構成ファイルで、このアダプター用の JAX-RS 2.0 アプリケーションのクラス名を構成します。 例: com.sample.JavaAdapterApplication

<?xml version="1.0" encoding="UTF-8"?>
<mfp:adapter name="JavaAdapter"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mfp="http://www.ibm.com/mfp/integration"
	xmlns:http="http://www.ibm.com/mfp/integration/http">

	<displayName>JavaAdapter</displayName>
	<description>JavaAdapter</description>

	<JAXRSApplicationClass>com.sample.JavaAdapterApplication</JAXRSApplicationClass>

	<property name="DB_url" displayName="Database URL" defaultValue="jdbc:mysql://127.0.0.1:3306/mobilefirst_training"  />
	<property name="DB_username" displayName="Database username" defaultValue="mobilefirst"  />
	<property name="DB_password" displayName="Database password" defaultValue="mobilefirst"  />

	<securityCheckDefinition name="sample" class="com.sample.sampleSecurityCheck">
    	<property name="maxAttempts" defaultValue="3"/>
	</securityCheckDefinition>
</mfp:adapter>
  • name: 必須。 アダプターの名前。 この名前は MobileFirst Server 内で固有でなければなりません。 英数字およびアンダースコアーを含めることができ、先頭は文字である必要があります。 アダプターを定義してデプロイした後に、その名前を変更することはできません。
  • displayName: オプション。 MobileFirst Operations Console に表示されるアダプターの名前。 このエレメントが指定されない場合は、代わりに name 属性の値が使用されます。
  • description: オプション。 アダプターに関する追加情報。 MobileFirst Operations Console に表示されます。
  • JAXRSApplicationClass: /adapter エンドポイントを公開するために必須。 このアダプターの JAX-RS アプリケーションのクラス名を定義します。 例では、com.sample.JavaAdapterApplication です。
  • securityCheckDefinition: オプション。 セキュリティー検査オブジェクトを定義します。 セキュリティー検査の作成チュートリアルで、セキュリティー検査についての詳細を参照してください。
  • property: オプション。 ユーザー定義プロパティーを宣言します。 以下の『カスタム・プロパティー』トピックで詳細を参照してください。

カスタム・プロパティー

adapter.xml ファイルには、ユーザー定義のカスタム・プロパティーを含めることもできます。 開発者がアダプターの作成中にそれらのプロパティーに割り当てた値は、アダプターを再デプロイせずに、MobileFirst Operations Console → 「[ご使用のアダプター]」→ 「構成」タブでオーバーライドすることができます。 ユーザー定義プロパティーは、ConfigurationAPI インターフェースを使用して読み取り、実行時にさらにカスタマイズできます。

注: 構成プロパティー・エレメントは、JAXRSApplicationClass エレメントの下に配置する必要があります。
上の例では、デフォルト値を指定して接続設定を定義し、これらの接続設定を後で AdapterApplication クラスで使用できるようにしてあります。

<property> エレメントには以下の属性があります。

  • name: 構成クラスで定義されている、プロパティーの名前。
  • defaultValue: 構成クラスで定義されたデフォルト値をオーバーライドします。
  • displayName: オプション。コンソールに表示される分かりやすい名前。
  • description: オプション。コンソールに表示される説明。
  • type: オプション。プロパティーが確実に、特定タイプ (integerstringboolean など) または有効な値のリスト (例えば type="['1','2','3']") になるようにします。

コンソール・プロパティー

構成のプルとプッシュ

カスタマイズしたアダプター・プロパティーは、「構成ファイル」タブに表示されるアダプター構成ファイルを使用して共有できます。
共有するためには、Maven または MobileFirst CLI を使用して、以下で説明する pull コマンドと push コマンドを使用します。 共有するプロパティーについては、そのプロパティーに対して指定されたデフォルト値を変更する 必要があります。

アダプター Maven プロジェクトのルート・フォルダーから以下のコマンドを実行します。

Maven

  • 構成ファイルをプルする場合
    mvn adapter:configpull -DmfpfConfigFile=config.json
    
  • 構成ファイルをプッシュする場合
    mvn adapter:configpush -DmfpfConfigFile=config.json
    

MobileFirst CLI

  • 構成ファイルをプルする場合
    mfpdev adapter pull
    
  • 構成ファイルをプッシュする場合
    mfpdev adapter push
    

複数のサーバーへの構成のプッシュ

pull コマンドと push コマンドは、使用している環境 (DEV、QA、UAT、PRODUCTION) に応じてアダプターで異なる値が必要となる各種の DevOps フローを作成する場合に役立ちます。

Maven
上記の説明で、デフォルトでの config.json ファイルの指定方法を確認してください。 異なるターゲットを処理するには、異なる名前のファイルを作成します。

MobileFirst CLI
デフォルトとは異なる構成ファイルを指定するには、–configFile フラグまたは -c フラグを使用します。

mfpdev adapter pull -c [adapterProject]/alternate_config.json

mfpdev help adapter pull/push を使用して、詳細を参照してください。

java フォルダー

JAX-RS 2.0 サービスの Java ソースは、このフォルダーに入っています。 JAX-RS 2.0 サービスは、アプリケーション・クラス (これで com.ibm.mfp.adapter.api.MFPJAXRSApplication を拡張します) とリソース・クラスで構成されます。

JAX-RS 2.0 のアプリケーション・クラスおよびリソース・クラスは、Java メソッドおよび URL に対するそれらのメソッドのマッピングを定義します。
com.sample.JavaAdapterApplication が JAX-RS 2.0 アプリケーション・クラスで、com.sample.JavaAdapterResource がアプリケーション内に含まれる JAX-RS 2.0 リソースです。

JAX-RS 2.0 アプリケーション・クラス

JAX-RS 2.0 アプリケーション・クラスは、そのアプリケーションに含まれるリソースを JAX-RS 2.0 フレームワークに通知します。

package com.sample.adapter;

import java.util.logging.Logger;
import com.ibm.mfp.adapter.api.MFPJAXRSApplication;

public class JavaAdapterApplication extends MFPJAXRSApplication{

    static Logger logger = Logger.getLogger(JavaAdapterApplication.class.getName());

    @Override
    protected void init() throws Exception {
        logger.info("Adapter initialized!");
    }

    @Override
    protected String getPackageToScan() {
        //The package of this class will be scanned (recursively) to find JAX-RS 2.0 resources.
        return getClass().getPackage().getName();
    }
}

MFPJAXRSApplication クラスは、パッケージをスキャンして JAX-RS 2.0 リソースを見つけ、自動的にリストを作成します。 さらに、アダプターがデプロイされるとすぐ (サービスを開始する前) に、Mobile Foundation ランタイムの開始時に、MobileFirst Server によってこのクラスの init メソッドが呼び出されます。

JAX-RS 2.0 リソースの実装

JAX-RS 2.0 リソースは、ルート URL にマップされる POJO (Plain Old Java Object) です。このリソースには、このルート URL とその子 URL への要求にサービスを提供する Java メソッドが含まれています。 どのリソースも、別々の URL セットを持つことができます。

package com.sample.adapter;

import java.util.logging.Logger;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path("/")
public class JavaAdapterResource {

    //Define logger (Standard java.util.Logger)
    static Logger logger = Logger.getLogger(JavaAdapterResource.class.getName());

    //Path for method: "<server address>/Adapters/adapters/JavaAdapter/{username}"
    @GET
    @Path("/{username}")
    public String helloUser(@PathParam("username") String name){
        return "Hello " + name;
    }
}
  • クラス定義の前の @Path("/") は、このリソースのルート・パスを判別します。 複数のリソース・クラスがある場合は、各リソースに異なるパスを設定する必要があります。

    例えば、ブログのユーザーを管理するために @Path("/users") が指定された UserResource がある場合、そのリソースには http(s)://host:port/ProjectName/adapters/AdapterName/users/ を介してアクセスできます。

    同じアダプターに、ブログの投稿を管理するための、@Path("/posts") が指定された別のリソース PostResource を含めることもできます。 これには、http(s)://host:port/ProjectName/adapters/AdapterName/posts/ という URL を介してアクセスできます。

    上の例ではリソース・クラスは 1 つのみであるため、http(s)://host:port/Adapters/adapters/JavaAdapter/ を介してアクセスできるように、@Path("/") に設定されます。

  • 各メソッドの前には 1 つ以上の JAX-RS 2.0 アノテーション (例えば、@GET@PUT@POST@DELETE、または@HEAD などの「HTTP 要求」タイプのアノテーション) を指定します。 これらのアノテーションは、そのメソッドにアクセス可能な方法を定義します。

  • もう 1 つの例 @Path("/{username}") は、(リソース・レベルのパスに加えて) このプロシージャーにアクセスするためのパスを定義しています。 見ると分かるとおり、このパスには変数部分が含まれています。 この変数は、後で、@PathParam("username") String name のように定義して、メソッドのパラメーターとして使用されます。

その他のさまざまなアノテーションを使用できます。 以下で、『Annotation Types Summary』 を参照してください。 https://jax-rs-spec.java.net/nonav/2.0-rev-a/apidocs/javax/ws/rs/package-summary.html

重要: アダプター実装内で javax.ws.rs.* または javax.servlet.* からクラスへの静的参照を使用する場合、以下のいずれかのオプションを使用して必ず RuntimeDelegate を構成する必要があります。

  • Liberty jvm.options-Djavax.ws.rs.ext.RuntimeDelegate=org.apache.cxf.jaxrs.impl.RuntimeDelegateImpl を設定します または
  • システム・プロパティーまたは JVM カスタム・プロパティー javax.ws.rs.ext.RuntimeDelegate=org.apache.cxf.jaxrs.impl.RuntimeDelegateImpl を設定します

HTTP セッション

MobileFirst Server は HTTP セッションに依存しないため、各要求が異なるノードに到達する可能性があります。 データをある要求から次の要求へと保持するためには、HTTP セッションに依存しないようにする必要があります。

サーバー・サイド API

Java アダプターは、サーバー・サイド Java API を使用して、MobileFirst Serverに関連する操作 (他のアダプターの呼び出し、サーバー・ログへの記録、構成プロパティーの値の取得、Analytics へのアクティビティーの報告、要求の発行者の ID の取得など) を実行できます。

構成 API

ConfigurationAPI クラスは、adapter.xml または MobileFirst Operations Console で定義されているプロパティーを取得するための API を提供します。

Java クラス内に、クラス・レベルで以下を追加します。

@Context
ConfigurationAPI configurationAPI;

その後、configurationAPI インスタンスを使用してプロパティーを取得できます。

configurationAPI.getPropertyValue("DB_url");

アダプター構成が MobileFirst Operations Console から変更されると、JAX-RS アプリケーション・クラスが再ロードされ、その init メソッドが再び呼び出されます。

getServerJNDIProperty メソッドを使用して、サーバー構成の JNDI プロパティーを取得することも可能です。

Java SQL アダプターチュートリアルで使用例を参照できます。

アダプター API

AdaptersAPI クラスは、現行アダプターに関する情報を取得し、他のアダプターに REST 要求を送信するための API を提供します。

Java クラス内に、クラス・レベルで以下を追加します。

@Context
AdaptersAPI adaptersAPI;

拡張アダプターの使用法とマッシュアップチュートリアルで使用例を参照できます。

Analytics API

AnalyticsAPI クラスは、Analytics に情報を報告するための API を提供します。

Java クラス内に、クラス・レベルで以下を追加します。

@Context
AnalyticsAPI analyticsAPI;

Analytics API チュートリアルで使用例を参照できます。

セキュリティー API

AdapterSecurityContext クラスは、アダプター REST 呼び出しのセキュリティー・コンテキストを提供します。

Java クラス内に、クラス・レベルで以下を追加します。

@Context
AdapterSecurityContext securityContext;

その後、例えば、以下を使用して現行の AuthenticatedUser を取得することができます。

AuthenticatedUser currentUser = securityContext.getAuthenticatedUser();

Java アダプターの例

HTTP または SQL のバックエンドと通信する Java アダプターの例については、以下を参照してください。

Inclusive terminology note: The Mobile First Platform team is making changes to support the IBM® initiative to replace racially biased and other discriminatory language in our code and content with more inclusive language. While IBM values the use of inclusive language, terms that are outside of IBM's direct influence are sometimes required for the sake of maintaining user understanding. As other industry leaders join IBM in embracing the use of inclusive language, IBM will continue to update the documentation to reflect those changes.
Last modified on March 15, 2018