我当前正在尝试设置一个自定义ConfigSource
来从我们的DB2中读取配置值。由于ConfigSource是通过ServiceLoader加载的,因此似乎无法通过JPA访问数据库,因为ServiceLoader很早就扫描自定义ConfigSource。
有什么想法吗?
答案 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中的值。当然,您也可以根据需要将代码分成两个类。