サービスラッパーの作成
サービス ラッパーを使用すると、デフォルトのサービス メソッドをオーバーライドして追加機能を追加できます。 たとえば、Liferay の User オブジェクトに追加したフィールドの値を、Liferay API の addUser または updateUser メソッドが呼び出されるたびに保存したい場合があります。 Liferay のサービス ラッパーは、Liferay のサービスをカスタマイズするための使いやすい拡張ポイントを提供します。
サービスラッパーのデプロイ
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132
http://localhost:8080でLiferayにサインインします。 メールアドレス test@liferay.com とパスワード testを使用してください。 プロンプトが表示されたら、パスワードを learnに変更します。
次に、次の手順に従って例をデプロイします。
-
liferay-j1c2.zipサンプル プロジェクトをダウンロードして解凍します。curl https://resources.learn.liferay.com/examples/liferay-j1c2.zip -Ounzip liferay-j1c2.zip -
プロジェクトモジュールをビルドしてデプロイします。
cd liferay-j1c2./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、デプロイされたjarをDockerコンテナ上の
/opt/liferay/osgi/modulesにコピーするのと同じです。 -
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.j1c2.impl_1.0.0 [1439] -
サンプル モジュールのカスタマイズを確認するには、ブラウザーを開いて
https://localhost:8080にアクセスします。 -
Liferay からログアウトして再度ログインします。 サービスラッパーは、Liferay Docker コンテナコンソールに次のメッセージを出力します。
INFO [http-nio-8080-exec-6][J1C2UserLocalServiceWrapper:25] Invoking #authenticateByEmailAddress(long, String, String, Map, Map, Map)
この例では、 authenticateByEmailAddress メソッドが呼び出されるたびに、コンソールにメッセージを出力します。
サービスラッパークラスの作成
- ラッピングしたいサービスを選択してください。 この例では、
UserLocalServiceのサービス ラッパーを作成し、UserLocalServiceWrapperを拡張します。
public class J1C2UserLocalServiceWrapper extends UserLocalServiceWrapper {
- クラスに注釈を付けて、これがサービス ラッパー コンポーネントであることを Liferay が認識できるようにします。
@Component(service = ServiceWrapper.class)
- オーバーライドするメソッドを選択し、独自の実装を追加します。
@Override
public int authenticateByEmailAddress(
long companyId, String emailAddress, String password,
Map<String, String[]> headerMap, Map<String, String[]> parameterMap,
Map<String, Object> resultsMap)
throws PortalException {
if (_log.isInfoEnabled()) {
_log.info(
"Invoking #authenticateByEmailAddress(long, String, String, " +
"Map, Map, Map)");
}
return super.authenticateByEmailAddress(
companyId, emailAddress, password, headerMap, parameterMap,
resultsMap);
}
メソッドのオーバーライド
-
テキスト エディターまたは IDE で
J1C2UserLocalServiceWrapperクラスを開きます。 -
クラス内に、
getUserというパブリック メソッドを作成します。 これはUserLocalServiceのgetUserメソッドをオーバーライドします。 そのため、引数としてlongを渡し、Userを返す必要があります。 このメソッドはPortalExceptionもスローする必要があります。 必ず@Overrideアノテーションを追加してください。@Override public User getUser(long userId) throws PortalException { } -
このメソッドは
Userオブジェクトを返すので、ファイルの先頭にインポートします。import com.liferay.portal.kernel.model.User; -
例にあるものと同様のメソッドを作成して、
getUserメソッドが呼び出されるたびに、コンソールにメッセージが出力されるようにします。if (_log.isInfoEnabled()) { _log.info( "Invoking #getUser(long)"); } -
それでも
getUserを呼び出す必要があるため、メソッドがgetUserのスーパーメソッドを呼び出した結果を返すようにします。return super.getUser(userId); -
最終的に、メソッドは次のようになります。
@Override public User getUser(long userId) throws PortalException { if (_log.isInfoEnabled()) { _log.info( "Invoking #getUser(long)"); } return super.getUser(userId); } -
モジュールをビルドしてデプロイします。
./gradlew build deploy -Ddeploy.docker.container.id=$(docker ps -lq)
サービスラッパーのテスト
-
https://localhost:8080に戻ります。 -
ユーザーメニューで マイプロフィール をクリックします。 プロフィールページに移動します。
-
プロフィールページを開くと、Liferay は
getUserメソッドを数回呼び出します。 コンソールに次のメッセージがないか確認してください。
INFO [http-nio-8080-exec-4][J1C2UserLocalServiceWrapper:39] Invoking #getUser(long)
これで、 Liferay サービスラッパーを使用してサービスのメソッドをカスタマイズしました。