Extending Liferay
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

サービスラッパーの作成

サービス ラッパーを使用すると、デフォルトのサービス メソッドをオーバーライドして追加機能を追加できます。 たとえば、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に変更します。

次に、次の手順に従って例をデプロイします。

  1. liferay-j1c2.zip サンプル プロジェクトをダウンロードして解凍します。

    curl https://resources.learn.liferay.com/examples/liferay-j1c2.zip -O
    
    unzip liferay-j1c2.zip
    
  2. プロジェクトモジュールをビルドしてデプロイします。

    cd liferay-j1c2
    
    ./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    

    このコマンドは、デプロイされたjarをDockerコンテナ上の /opt/liferay/osgi/modules にコピーするのと同じです。

  3. Liferay Dockerコンテナコンソールでデプロイを確認します。

    STARTED com.acme.j1c2.impl_1.0.0 [1439]
    
  4. サンプル モジュールのカスタマイズを確認するには、ブラウザーを開いて https://localhost:8080にアクセスします。

  5. Liferay からログアウトして再度ログインします。 サービスラッパーは、Liferay Docker コンテナコンソールに次のメッセージを出力します。

    INFO  [http-nio-8080-exec-6][J1C2UserLocalServiceWrapper:25] Invoking #authenticateByEmailAddress(long, String, String, Map, Map, Map)
    

この例では、 authenticateByEmailAddress メソッドが呼び出されるたびに、コンソールにメッセージを出力します。

サービスラッパークラスの作成

  1. ラッピングしたいサービスを選択してください。 この例では、 UserLocalServiceのサービス ラッパーを作成し、 UserLocalServiceWrapperを拡張します。
public class J1C2UserLocalServiceWrapper extends UserLocalServiceWrapper {
  1. クラスに注釈を付けて、これがサービス ラッパー コンポーネントであることを Liferay が認識できるようにします。
@Component(service = ServiceWrapper.class)
  1. オーバーライドするメソッドを選択し、独自の実装を追加します。
@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);
}

メソッドのオーバーライド

  1. テキスト エディターまたは IDE で J1C2UserLocalServiceWrapper クラスを開きます。

  2. クラス内に、 getUserというパブリック メソッドを作成します。 これは UserLocalServicegetUser メソッドをオーバーライドします。 そのため、引数として long を渡し、 Userを返す必要があります。 このメソッドは PortalExceptionもスローする必要があります。 必ず @Override アノテーションを追加してください。

    @Override
    public User getUser(long userId) throws PortalException {
    }
    
  3. このメソッドは User オブジェクトを返すので、ファイルの先頭にインポートします。

    import com.liferay.portal.kernel.model.User;
    
  4. 例にあるものと同様のメソッドを作成して、 getUser メソッドが呼び出されるたびに、コンソールにメッセージが出力されるようにします。

    if (_log.isInfoEnabled()) {
        _log.info(
            "Invoking #getUser(long)");
    }
    
  5. それでも getUser を呼び出す必要があるため、メソッドが getUserのスーパーメソッドを呼び出した結果を返すようにします。

    return super.getUser(userId);
    
  6. 最終的に、メソッドは次のようになります。

    @Override
    public User getUser(long userId) throws PortalException {
        if (_log.isInfoEnabled()) {
            _log.info(
                "Invoking #getUser(long)");
        }
    
        return super.getUser(userId);
    }
    
  7. モジュールをビルドしてデプロイします。

    ./gradlew build deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    

サービスラッパーのテスト

  1. https://localhost:8080に戻ります。

  2. ユーザーメニューで マイプロフィール をクリックします。 プロフィールページに移動します。

  3. プロフィールページを開くと、Liferay は getUser メソッドを数回呼び出します。 コンソールに次のメッセージがないか確認してください。

INFO  [http-nio-8080-exec-4][J1C2UserLocalServiceWrapper:39] Invoking #getUser(long)

これで、 Liferay サービスラッパーを使用してサービスのメソッドをカスタマイズしました。