使用 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 中的值。当然你也可以把代码一分为二类类
我目前正在尝试设置自定义 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 中的值。当然你也可以把代码一分为二类类