使用 JPA 的 microprofile-config 自定义 ConfigSource

microprofile-config custom ConfigSource using JPA

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

有什么想法吗?

您可以将您的 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 中的值。当然你也可以把代码一分为二类类