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