Настраиваемый конфигурационный файл microprofile с использованием JPA
Я сейчас пытаюсь настроить кастом ConfigSource
чтение значений конфигурации из нашей DB2. Поскольку ConfigSources загружаются через ServiceLoader, похоже, что нет никакого доступа к базе данных через JPA, так как ServiceLoader сканирует пользовательские ConfigSources очень рано.
Есть идеи?
0 ответов
Вы можете аннотировать свой ConfigSource как одноэлементный сессионный компонент и пометить его для активной инициализации во время последовательности запуска приложения. Также вам необходимо определить статическую переменную-член, содержащую ваши значения конфигурации.
При такой настройке вы можете лениво загружать значения свойств из внедренного источника JPA или из любого другого CDI или EJB.
См. Следующий пример кода
@Startup
@Singleton
public class MyConfigSource implements ConfigSource {
public static final String NAME = "MyConfigSource";
public static Map<String, String> properties = null; // note to use static here!
@PersistenceContext(unitName = ".....")
private EntityManager manager;
@PostConstruct
void init() {
// load your data from teh JPA source or EJB
....
}
@Override
public int getOrdinal() {
return 890;
}
@Override
public String getValue(String key) {
if (properties != null) {
return properties.get(key);
} else {
return null;
}
}
@Override
public String getName() {
return NAME;
}
@Override
public Map<String, String> getProperties() {
return properties;
}
}
ConfigSources - это POJO, потому что, если bean-компонент CDI ожидал, что конфигурация будет введена в него при запуске на основе ConfigSource, который имеет зависимости от CDI, вы можете столкнуться с проблемами цикла запуска.
По этой причине пример CongigSoruce создается дважды - один раз в начале из Config-API, а затем из реализации CDI в @PostConstruct. С помощью статической переменной 'properties' мы перегружаем значения из уже созданного ConfigSource. Конечно, вы также можете разделить код на два класса, если хотите.