6.4. Jakarta EE の活用
META-INF/services
ファイルを適切に設定してプロバイダーを参照するように、サービスプロバイダーを Jakarta EE コンポーネント内にパッケージ化できます。たとえば、プロバイダーがサードパーティーのライブラリーを使用する必要がある場合は、プロバイダーを ear にパッケージ化して、サードパーティーライブラリーを ear の lib/
ディレクトリーに保存します。また、プロバイダー jars は EJB、WARS、および EAR が JBoss EAP 環境で使用できる jboss-deployment-structure.xml
ファイルを利用できます。このファイルの詳細は、JBoss EAP のドキュメントを参照してください。これにより、他の細かいアクションから、外部の依存関係をプルすることができます。
ProviderFactory
実装はプレーンな Java オブジェクトである必要があります。ただし、現時点では、プロバイダークラスを Stateful EJB として実装することもできます。これは、以下の方法で行います。
@Stateful @Local(EjbExampleUserStorageProvider.class) public class EjbExampleUserStorageProvider implements UserStorageProvider, UserLookupProvider, UserRegistrationProvider, UserQueryProvider, CredentialInputUpdater, CredentialInputValidator, OnUserCache { @PersistenceContext protected EntityManager em; protected ComponentModel model; protected KeycloakSession session; public void setModel(ComponentModel model) { this.model = model; } public void setSession(KeycloakSession session) { this.session = session; } @Remove @Override public void close() { } ... }
@Local
アノテーションを定義し、そこにプロバイダークラスを指定します。これを行わないと、EJB はプロバイダーインスタンスを正しくプロキシーせず、プロバイダーは機能しません。
@Remove
アノテーションをプロバイダーの close()
メソッドに配置します。配置しない場合には、ステートフル Bean はクリーンアップされず、最終的にエラーメッセージが表示される可能性があります。
ProviderFactory
の実装は、プレーンな Java オブジェクトである必要があります。ファクトリークラスは create()
メソッドで Stateful EJB の JNDI ルックアップを実行します。
public class EjbExampleUserStorageProviderFactory implements UserStorageProviderFactory<EjbExampleUserStorageProvider> { @Override public EjbExampleUserStorageProvider create(KeycloakSession session, ComponentModel model) { try { InitialContext ctx = new InitialContext(); EjbExampleUserStorageProvider provider = (EjbExampleUserStorageProvider)ctx.lookup( "java:global/user-storage-jpa-example/" + EjbExampleUserStorageProvider.class.getSimpleName()); provider.setModel(model); provider.setSession(session); return provider; } catch (Exception e) { throw new RuntimeException(e); } }