7.10. Leveraging Jakarta EE


META-INF/services 파일을 올바르게 설정하여 공급자를 가리키도록 사용자 스토리지 공급자를 모든 자karta EE 구성 요소 내에 패키징할 수 있습니다. 예를 들어 공급자가 타사 라이브러리를 사용해야 하는 경우 EAR 내에서 공급자를 패키지하고 이러한 타사 라이브러리를 EAR의 lib/ 디렉터리에 저장할 수 있습니다. 또한 공급자 JAR는 Egresss, WARS 및 EARs가 JBoss EAP 환경에서 사용할 수 있는 jboss-deployment-structure.xml 파일을 사용할 수 있습니다. 이 파일에 대한 자세한 내용은 JBoss EAP 설명서를 참조하십시오. 이를 통해 다른 세분화된 작업 간에 외부 종속성을 가져올 수 있습니다.

공급자 구현은 일반 java 오브젝트여야 합니다. 또한 현재 Stateful Egresss로 UserStorageProvider 클래스 구현을 지원합니다. JPA를 사용하여 관계형 저장소에 연결하려는 경우 특히 유용합니다. 이렇게 하면 됩니다.

@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() {
    }
...
}
Copy to Clipboard

@Local 주석을 정의하고 해당 공급자 클래스를 지정해야 합니다. 이 작업을 수행하지 않으면 NodePort가 사용자를 올바르게 프록시하지 않으며 공급자가 작동하지 않습니다.

공급자의 close() 메서드에 @Remove 주석을 배치해야 합니다. 그러지 않으면 상태 저장 빈이 정리되지 않으며 결국 오류 메시지가 표시될 수 있습니다.

UserStorageProvider 의 구현은 일반 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);
        }
    }
Copy to Clipboard

또한 이 예제에서는 공급자와 동일한 JAR에 JPA 배포를 정의했다고 가정합니다. 즉, persistence.xml 파일 및 JPA @Entity 클래스를 의미합니다.

주의

JPA를 사용하는 경우 추가 데이터 소스는 XA 데이터 소스여야 합니다. Red Hat Single Sign-On 데이터 소스는 XA 데이터 소스가 아닙니다. 동일한 트랜잭션에서 둘 이상의 XA 데이터 소스와 상호 작용하면 서버에서 오류 메시지를 반환합니다. 단일 트랜잭션에서는 XA가 아닌 하나의 리소스만 허용됩니다. XA 데이터 소스 배포에 대한 자세한 내용은 JBoss EAP 설명서를 참조하십시오.

CDI는 지원되지 않습니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat