我正在使用EJB 3.0和CDI开发一个将部署在Websphere应用服务器中的java ee应用程序。
我需要有一个属性文件,我从中读取某些配置参数,此属性文件应该驻留在将部署我的代码的主机系统的文件系统中。
将属性文件的基本路径(将放置属性文件的目录)配置为Websphere应用程序服务器中的名称空间绑定字符串资源。
目前我编写了一个Utility类来检索和使用属性文件,如下所示。
@Singleton
public class AppPropertyUtil {
private static Hashtable apppProperties;
@Resource(name="jndi/basePath",lookup="jndi/basePath")
private static String basePath;
private static final Logger LOGGER = LoggerFactory.getLogger(AppPropertyUtil.class);
protected void loadPropertyBundleFromFileSystem(String path)
{
InputStream inputStream = null;
Properties properties = null;
try {String fullPath=basePath+"/"+path+".properties";
LOGGER.info("Property file path : "+fullPath);
inputStream = new FileInputStream(new File(fullPath));
if (inputStream != null) {
properties = new Properties();
properties.load(inputStream);
LOGGER.info("Properties loaded");
apppProperties = (Hashtable)properties;
}
} catch (FileNotFoundException exception) {
LOGGER.error("Cannot read property bundle ",exception);
}
catch (IOException | IllegalArgumentException exception) {
LOGGER.error("Unable to loadproperties ",
exception);
}
}
public String getProperty(String key)
{
if(apppProperties == null)
{
loadPropertyBundleFromFileSystem("AppProps");
}
Object value = apppProperties.get(key);
if(value != null){
return (String) value;
}
return null;
}
}
但是使用@Resource注释将要求将AppPropertyUtil类注入任何希望使用它的类中。因此,我无法在任何未管理的POJO类中使用它。
请帮助我了解这是否是符合上述要求的最佳方法,还是可以改进。我还想使getProperty方法和loadPropertyBundleFromFileSystem方法静态以便从静态上下文中使用它,但是不可能因为应该注入类来使用它。
提前致谢
答案 0 :(得分:0)
理想情况下,您不需要从任何POJO访问您的班级。使用设计模式并分离您的顾虑。使用您的类作为服务来加载您的属性文件并提供Map或Set的内容。 POJO模型不应该关心,但是您的其他类可以读取该地图/属性集并将它们传递给您的pojo或其他需要它但没有直接访问它的类。
另一个选择是删除@Resource
并使它只是一个普通的旧的util类,你在文件名中传入以读取它的构造函数,然后当你调用getProperty
时,你做的就是你做以检查是否已经加载,如果没有加载它。
在提供@Resource
部件的工厂中包裹它,它可以防止您的EE代码流入您的其他罐子(工具)。