サービスラッパーの作成
サービスラッパーを使用すると、デフォルトのサービスメソッドをオーバーライドして、追加機能を追加できます。 例えば、Liferay API の User メソッドが呼び出されるたびに、Liferay の 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サービスラッパーを使用して、サービスのメソッドをカスタマイズしました。