jpa - 使用 JPA 的 microprofile-config 自定义 ConfigSource
问题描述
我目前正在尝试ConfigSource
从我们的 DB2 设置自定义读取配置值。由于 ConfigSource 是通过 ServiceLoader 加载的,因此看起来无法通过 JPA 访问数据库,因为 ServiceLoader 很早就扫描了自定义 ConfigSource。
有任何想法吗?
解决方案
您可以将 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 中的值。当然,如果您愿意,您也可以将代码分成两个类。
推荐阅读
- jquery - Jquery - 多个下拉列表,禁用其他列表中的选定条目
- python - 如何使用 python 访问演示文稿的形状或文本运行中存在的 url?
- r - 在绘图前整理出小于 10 的计数
- ruby-on-rails - 我可以将现有的 Redis 用于自定义 Rails 缓存吗?
- c++ - 如何在类层次结构中传递智能指针
- ruby-on-rails - Rails (agile web development with rails 4th edition) 加载本地网站时出现问题,出现语法错误
- vb.net - 打印 Windows 窗体的特定区域
- c# - Service Fabric 应用程序升级失败。文件加载异常
- java - 当我尝试重新创建 Activity 时,应用程序崩溃
- python-3.x - 使用索引/索引列表从二维列表中获取某些值