2012-04-03 5 views
1

まず、よくある質問のバリエーションを繰り返すことについてお詫び申し上げます。しかし、私はここで最善のアプローチを理解するのに苦労しています。私はHibernateとGlassfish 3を使用するアプリケーションを持っています。他の人と同じように、私はwarファイルの外からHibernateプロパティをロードできるようにしたいと思います。私が働くことができた唯一の解決策は次のとおりです。 domains/domain1/configフォルダからプロパティをロードします。ServletContextを使用して外部からのHibernateプロパティを読み取る

private Properties getLocalHibernateProperties() { 
    Properties properties = new Properties(); 
    try { 
    File pf = new File(System.getProperty("user.dir"), PROPERTIES_FILE_NAME); 
    InputStream inStream = new FileInputStream(pf); 
    properties.load(inStream); 
    } 
    catch (Exception e) { 
    e.printStackTrace(); 
    }  
    return properties; 
} 

しかし、私はまた、発見し、例のServletContextを使用していますHow to read properties file placed outside war?ています。様々な部品の組み合わせ:私は第二の溶液は、サーブレットのCLASSPATHを検索することを理解することができます

in web.xml <listener-class>foo.bar.startup.HibernatePropertiesLoader</listener-class> 

public class HibernatePropertiesLoader implements ServletContextListener { 
    public void contextInitialized(ServletContextEvent event){ 
     ServletContext context = event.getServletContext(); 
     context.setAttribute("settings", new HibernatePropertiesReader(context)); 
    } 
    public void contextDestroyed(ServletContextEvent event){} 
} 

public class HibernatePropertiesReader { 
    ServletContext ctx = null; 

    public HibernatePropertiesReader(ServletContext ctx) { 
    this.ctx = ctx; 
    } 

    public Properties getLocalHibernateProperties() { 
    Properties properties = new Properties(); 
    try { 
     InputStream inStream = ctx.getResourceAsStream(PROPERTIES_FILE); 
     properties.load(inStream); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
     }  
    return properties; 
    } 
} 

は - (?これは正しい)ので、私の元のソリューションよりも柔軟です。しかし、HibernateUtilsクラスのプロパティの使い方(アクセス)を理解できません。私はServletContext.getResourceAsStreamは、通常、ファイルをロードするために使用される

答えて

2

...

どのような援助、助言、より良いソリューションが高く評価....これは根本的な何かのServletContextの私の理解に欠けがあることを意味していることを推測しますウェブアプリケーション自体から。あなたのようにあなたのプロパティファイルを配置する場合、例えば:

<CONTAINER_ROOT>/webapps/<CONTEXT>/WEB-INF/conf/hibernate.properties 

その後、この方法はまた、jarファイルから「リソース」をロードするために使用されるが、最初の方法が可能

ctx.getResourceAsStream("/WEB-INF/conf/hibernate.properties"); 

を使用してファイルを読み込むことができますおそらく設定ファイルを取得する方が良いでしょう。この場合、JavaDocsは非常に役に立ちます。

== UPDATE ==

私はあなたの問題は今、あなたは性質がサーブレットコンテキストから出て、あなたのHibernate設定にオブジェクトを得るのですか、である参照してください。これはアプリケーションのレイアウトがどのようなものかによって異なります。あなたは春を使っていますか?あなたがいると仮定すると、

、迅速かつ汚いソリューションは、サーブレットAPIにHibernateUtilのを(HibernateUtilのと仮定すると春から構成されている)HibernateUitlがServletContextAwareインターフェイスを実装しており、以下の

public class HibernateUtil implements ServletContextAware { 

private ServletContext servletContext; 

... 

public void setServletContext(ServletContext servletContext) { 
    this.servletContext = servletContext; 
} 

private Properties getProperties() { 
    return servletContext.getAttribute("settings").getLocalHibernateProperties(); 
} 

... 

} 

このカップルのようなコードを持っているだろうしかし、これは望ましくない可能性があります。少し洗練された解決策は、HibernatePropertiesSourceインターフェースを作成してから、上記のメソッドを持つServletContextHibernatePropertiesSourceの実装をHibernateUtilに挿入することです。

また、これはすべてあなたがSpringを使用していることを前提としています。

+0

ServletContextは、アプリケーションの外部から 'インストール固有の'プロパティをロードするのに本当に適切ではありませんか?最初の解決策はおそらく柔軟ではないと私は思いました。おそらく私はここで間違っています。 – skyman

+0

インストールルートにコンテキスト固有のプロパティを設定するとどうなりますか?それらをユーザーのホームディレクトリに置くことを提案しましたか?単一のユーザーが、異なるポート上の同じアプリケーションの複数のインスタンスを実行している可能性があります。 – Pace

+0

ローカルの設定データを置き換えずにサイトのWARをアップグレードする必要がある問題を解決しようとしていると思います。コンテキストルートの内側が実際にはパッケージ化されていないWARの中にあるということを訂正していますか? – skyman

関連する問題