在Java EE应用程序中从FileSystem加载属性文件

时间:2016-01-15 15:38:09

标签: java java-ee resourcebundle


我正在使用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方法静态以便从静态上下文中使用它,但是不可能因为应该注入类来使用它。

提前致谢

1 个答案:

答案 0 :(得分:0)

理想情况下,您不需要从任何POJO访问您的班级。使用设计模式并分离您的顾虑。使用您的类作为服务来加载您的属性文件并提供Map或Set的内容。 POJO模型不应该关心,但是您的其他类可以读取该地图/属性集并将它们传递给您的pojo或其他需要它但没有直接访问它的类。

另一个选择是删除@Resource并使它只是一个普通的旧的util类,你在文件名中传入以读取它的构造函数,然后当你调用getProperty时,你做的就是你做以检查是否已经加载,如果没有加载它。

在提供@Resource部件的工厂中包裹它,它可以防止您的EE代码流入您的其他罐子(工具)。