使用JPA的microprofile-config自定义ConfigSource

时间:2018-08-31 14:29:15

标签: jpa microprofile

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以将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中的值。当然,您也可以根据需要将代码分成两个类。