首页 > 解决方案 > 使用 JPA 的 microprofile-config 自定义 ConfigSource

问题描述

我目前正在尝试ConfigSource从我们的 DB2 设置自定义读取配置值。由于 ConfigSource 是通过 ServiceLoader 加载的,因此看起来无法通过 JPA 访问数据库,因为 ServiceLoader 很早就扫描了自定义 ConfigSource。

有任何想法吗?

标签: jpamicroprofile

解决方案


您可以将 ConfigSource 注释为单例会话 bean,并将其标记为在应用程序启动序列期间进行急切初始化。您还需要定义一个静态成员变量来保存您的配置值。

使用此设置,您可以从注入的 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 的,因为如果 CDI bean 期望在启动时基于依赖于 CDI 的 ConfigSource 将配置注入其中,那么您可能会遇到启动循环问题。

出于这个原因,示例 CongigSoruce 被构造了两次——一次从 Config-API 开始,然后从 @PostConstruct 上的 CDI 实现开始。使用静态变量“properties”,我们重载了已经构建的 ConfigSource 中的值。当然,如果您愿意,您也可以将代码分成两个类。


推荐阅读