ApplicationInitializerCdiExtension.java
package io.extact.rms.platform.extension;
import java.util.List;
import jakarta.enterprise.event.Observes;
import jakarta.enterprise.inject.spi.BeforeBeanDiscovery;
import jakarta.enterprise.inject.spi.Extension;
import jakarta.enterprise.inject.spi.ProcessAnnotatedType;
import jakarta.enterprise.inject.spi.WithAnnotations;
import jakarta.enterprise.inject.spi.configurator.AnnotatedTypeConfigurator;
import org.eclipse.microprofile.config.ConfigProvider;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ApplicationInitializerCdiExtension implements Extension {
private static final String CDI_REGISTER_CONFIG_KEY = "configuredCdi.register";
private static final String CDI_ALIAS_CONFIG_KEY = "configuredCdi.alias";
void enabledIfRuntimeConfig(@Observes @WithAnnotations(EnabledIfRuntimeConfig.class) ProcessAnnotatedType<?> event) {
EnabledIfRuntimeConfig annotation = event.getAnnotatedType().getAnnotation(EnabledIfRuntimeConfig.class);
var config = ConfigProvider.getConfig();
String runtimeConfigValue = config.getValue(annotation.propertyName(), String.class);
if (runtimeConfigValue.equals(annotation.value())) {
log.info("EnabledIfRuntimeConfigがアノテートされているCDIクラスを有効化しました [Class:{}]", event.getAnnotatedType().getJavaClass().getSimpleName());
} else {
event.veto();
log.info("EnabledIfRuntimeConfigがアノテートされているCDIクラスを無効化しました [Class:{}]", event.getAnnotatedType().getJavaClass().getSimpleName());
}
}
void registerConfiguredBeans(@Observes BeforeBeanDiscovery event) {
var config = ConfigProvider.getConfig();
List<ConfiguredCdiBean> configCdiBeans = ConfiguredCdiBeanBinder.newListBinder(config).alias(CDI_ALIAS_CONFIG_KEY)
.key(CDI_REGISTER_CONFIG_KEY).bind();
if (configCdiBeans.isEmpty()) {
log.info("{}によるCDIBean登録はありませんでした", CDI_REGISTER_CONFIG_KEY);
}
configCdiBeans.forEach(configCdiBean -> {
AnnotatedTypeConfigurator<?> configurator = event.addAnnotatedType(configCdiBean.getBeanClass(), configCdiBean.getId());
configurator.add(configCdiBean.getScoped());
log.info("[{}]を設定によりCDIBean登録しました", configCdiBean.getBeanClass().getName());
});
}
}