Настраиваемый конфигурационный файл 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. Конечно, вы также можете разделить код на два класса, если хотите.

Другие вопросы по тегам