我目前正在尝试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 中的值。当然,如果您愿意,您也可以将代码分成两个类。