Как внедрить бин @Normal (@ApplicationScoped) в область видимости @Dependent, если у бина нет конструктора без аргументов - PullRequest
0 голосов
/ 30 мая 2018

Этот пост относится к моей более старой публикации , в которой я пытался понять требования конструктора без аргументов от 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();
    }

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

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

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

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

...