2016-01-15 11 views
1


我正在使用EJB 3.0和CDI開發將部署在Websphere應用程序服務器中的java ee應用程序。 我有一個要求有一個屬性文件,我從中讀取特定的配置參數,這個屬性文件應該駐留在我的代碼將被部署的主機系統的文件系統中。 屬性文件的基本路徑(將放置屬性文件的目錄)配置爲Websphere應用程序服務器中的名稱空間綁定字符串資源。在Java EE應用程序中從FileSystem中加載屬性文件

目前我編寫了一個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

理想情況下,你不應該需要從任何POJO訪問到您的類。使用設計模式並分離您的顧慮。使用你的課程作爲服務來加載你的財產文件,並提供一個地圖或其內容的集合。 POJO模型不應該在意,但其他類可以讀取該地圖/一組屬性,並將它們傳遞給pojo或其他需要它的類,但不能直接訪問它。

另一種選擇是去除@Resource,使這只是一個普通的老util的,你在文件名通過在它的構造函數讀取類,然後當你打電話getProperty,你做你做檢查,看它是否是已經加載,如果沒有,加載它。

將它包裝在供應@Resource部件的工廠中,它可以防止您的EE代碼滲入其他瓶子(utils)。

+0

第一個建議將班級作爲服務看起來不錯:)。我已經實現了第一個選項,通過重新設計類來充當啓動EJB Singleton服務並使其返回屬性映射。它現在有效.. – Jegajeeth

相關問題