Как внедрить бин @Normal (@ApplicationScoped) в область видимости @Dependent, если у бина нет конструктора без аргументов

Этот пост связан с моим старым постом SO, в котором я пытался понять требования конструктора без аргументов от WELD.

Прямо сейчас я пытаюсь выяснить, есть ли способ в CDI ввести @ApplicationScoped бин (@Normal) в @Dependent объем. Из того, что я прочитал из WELD, требования должны иметь не приватный конструктор без аргументов для прокси. Однако у меня нет контроля над определением компонента, так как оно предоставляется библиотекой. Мой код делает следующее:

    @Produces
    @ApplicationScoped
    @Named("keycloakAdmin")
    public Keycloak getKeycloakAdminClient(@Named("keycloakDeployment") final KeycloakDeployment deployment) {
        String clientId = deployment.getResourceName();
        Map<String, Object> clientCredentials = deployment.getResourceCredentials();

        // need to set the resteasy client connection pool size > 0 to ensure thread safety (https://access.redhat.com/solutions/2192911)
        ResteasyClient client = new ResteasyClientBuilder().connectionPoolSize(CONNECTION_POOL_SIZE).maxPooledPerRoute(CONNECTION_POOL_SIZE)
                .defaultProxy("localhost",8888)
                .build();

        KeycloakBuilder builder = KeycloakBuilder.builder()
                .clientId(clientId)
                .clientSecret((String) clientCredentials.get(CredentialRepresentation.SECRET))
                .realm(deployment.getRealm())
                .serverUrl(deployment.getAuthServerBaseUrl())
                .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
                .resteasyClient(client);

        return builder.build();
    }



    // error thrown here that cannot inject @Normal scoped bean as it is not proxyable because it has no no-args constructor
    @Produces
    @Dependent
    @Named("keycloakRealm")
    public RealmRepresentation getKeycloakRealm( @Named("keycloakAdmin") final Keycloak adminClient ){
        // error thrown here that cannot inject @Normal scoped bean as it is not proxyable because it has no no-arg
        return adminClient.realm(resolveKeycloakDeployment().getRealm()).toRepresentation();
    }

Проблема в том, что я не контролирую Keycloak боб; это обеспечивается библиотекой. Следовательно, у меня нет возможности предоставить бобу конструктор без аргументов.

Значит ли это, что это невозможно сделать? Есть ли обходные пути, которые можно использовать? Это может показаться существенным ограничением со стороны WELD, особенно когда речь идет о @Produceбобы сторонних производителей.

Моя цель - иметь одного Keycloak bean-компонент для приложения, так как он является потокобезопасным и должен быть инициализирован только один раз. Тем не менее, я хочу иметь возможность внедрять его в bean-объекты, не относящиеся к области приложения.

E сть @Singleton сфера, которая может решить мою проблему, но если @Singleton работает для этого случая, какова цель 2 разных областей? При каких обстоятельствах нужно, чтобы синглтон без прокси (@Singleton) против синглтона с прокси (@ApplicationScoped)? Или @Singleton для всего контейнера, тогда как @ApplicationScoped только для приложения (WAR) вместо этого? Как это относится к EAR или нескольким ушам?

0 ответов

Другие вопросы по тегам