我目前正在尝试ConfigSource
从我们的 DB2 设置自定义读取配置值。由于 ConfigSource 是通过 ServiceLoader 加载的,因此看起来无法通过 JPA 访问数据库,因为 ServiceLoader 很早就扫描了自定义 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 中的值。当然,如果您愿意,您也可以将代码分成两个类。