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); } }