6.4. Leveraging Jakarta EE
서비스 공급자는 공급자를 가리키도록 META-INF/services 파일을 올바르게 설정하는 한 모든 자karta EE 구성 요소 내에 패키징할 수 있습니다. 예를 들어, 공급자가 타사 라이브러리를 사용해야 하는 경우, 공급자를 북마트 내에 패키지하고 이러한 타사 라이브러리를 후자의 lib/ 디렉토리에 저장할 수 있습니다. 또한 공급자 ScanSettings는 Egresss, WARS 및 EARs가 JBoss EAP 환경에서 사용할 수 있는 jboss-deployment-structure.xml 파일을 사용할 수 있습니다. 이 파일에 대한 자세한 내용은 JBoss EAP 설명서를 참조하십시오. 이를 통해 다른 미세한 동작 중에서 외부 종속성을 가져올 수 있습니다.
ProviderFactory 구현은 일반 java 오브젝트여야 합니다. 그러나 현재는 공급자 클래스 구현을 Stateful Egresss로 지원합니다. 이렇게 하면 됩니다.
@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 주석을 정의하고 해당 공급자 클래스를 지정합니다. 이 작업을 수행하지 않으면 NodePort에서 공급자 인스턴스를 올바르게 프록시하지 않으며 공급자가 작동하지 않습니다.
공급자의 close() 메서드에 @Remove 주석을 넣습니다. 그러지 않으면 상태 저장 빈이 정리되지 않으며 결국 오류 메시지가 표시될 수 있습니다.
ProviderFactory 의 Ixmplementations는 일반 java 객체여야 합니다. 팩토리 클래스는 create() 메서드에서 Stateful NodePort의 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);
}
}