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

Loading Property file from FileSystem in a Java EE application


我正在使用 EJB 3.0 和 CDI 开发一个 java ee 应用程序,该应用程序将部署在 Websphere 应用程序服务器中。 我需要一个 属性 文件,我从中读取某些配置参数,这个 属性 文件应该驻留在我的代码将部署到的主机系统的文件系统中。 属性 文件的基本路径(放置 属性 文件的目录)在 Websphere 应用程序服务器中配置为名称 space 绑定字符串资源。

目前我编写了一个实用程序 class 来检索和使用如下所示的 属性 文件。

 @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 class 注入任何希望使用它的 class 中。因此,我将无法在任何不受管理的 POJO classes 中使用它。

请帮助我了解这是满足上述要求的最佳方法还是可以改进。我还想将 getProperty 方法和 loadPropertyBundleFromFileSystem 方法设为静态,以便从静态上下文中使用它,但这是不可能的,因为应该注入 class 才能使用。

提前致谢

理想情况下,您不需要从任何 POJO 访问您的 class。使用设计模式并分离您的关注点。使用您的 class 作为一项服务来加载您的 属性 文件并提供地图或它的内容集。 POJO 模型不应该关心,但您的其他 classes 可以读取 map/set 属性并将它们传递给您的 pojo 或其他需要它但没有直接访问权限的 classes

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

将其包装在提供 @Resource 部件的工厂中,这样可以防止您的 EE 代码渗入其他罐子(实用程序)。