Как внедрить бин @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 или нескольким ушам?