3

外部プロパティ ファイルからデータを読み取るサンプル Web アプリケーションを開発しました。プロパティ ファイルはシステムのソース フォルダにあり、WAR ファイルには含まれていません。

プロパティ ファイルには、次のようにアクセスします。

Properties prop = new Properties();
//File f1 = new File("Property.properties");
prop.load(getClass().getClassLoader().getResourceAsStream("Property.properties"));
  1. WAR ファイル内で外部からこのプロパティ ファイルにアクセスするにはどうすればよいですか?
  2. WAR ファイルで読み取るには、コードにどのような変更を加える必要がありますか?
4

3 に答える 3

8

Java™ Platform, Enterprise Edition (Java EE) Specification, v5のセクションEE.5.4 Simple Environment Entriesで説明されているように、単純な環境エントリを定義するのが最も用途の広いアプローチだと思います。

セクションから(68ページ):

単純な環境エントリは、アプリケーション コンポーネントのビジネス ロジックをカスタマイズするために使用される構成パラメーターです。環境エントリの値は、次の Java タイプのいずれかです: String、Character、Byte、Short、Integer、Long、Boolean、Double、および Float。

仕様のセクションEE.5.6.1.4 Standard Resource Manager Connection Factory Typesで説明されているように、URL 接続ファクトリーを使用することもできます。

アプリケーション コンポーネント プロバイダは、URL 接続を取得するために、java.net.URL リソース マネージャ接続ファクトリ タイプを使用する必要があります。

どちらも、Web アプリケーションのデプロイメント記述子でリソース参照の定義を必要とするため、 JNDI API を使用WEB-INF/web.xmlして値を注入したり、エントリ ポイントとして使用したりできます。@Resourcejava:comp/env

利点は、コードを再コンパイルせずに Web アプリケーションの構成を変更できることと、管理者が使い慣れているアプリケーション サーバーの管理ツールを使用して変更できることです。

web.xmlリソース参照を定義します。

<resource-ref>
  <res-ref-name>propertiesURL</res-ref-name>
  <res-type>java.net.URL</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
  <res-ref-name>propertiesPath</res-ref-name>
  <res-type>java.lang.String</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

次に、コードで次を使用して値にアクセスします。

@Resource
String propertiesPath;

@Resource
URL propertiesURL;

これにより、Java EE の要件が満たされ、メソッドへの入力パラメーターとして渡されたかのようにpropertiesPathorを使用できます。propertiesURL

さあ、WebSphere Application Server の期待に応える時が来ました。

定義したのは、管理された名前にマップする必要がある論理名です(アプリケーション サーバーはそれを認識しており、アプリケーションに提供できます)。

WebSphere Application ServerWEB-INF/ibm-web-bnd.xmlでは、次の構成で WebSphere Binding 記述子を使用します。

<?xml version="1.0" encoding="UTF-8"?>
<web-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_1.xsd"
  version="1.1">

  <virtual-host name="default_host" />

  <resource-ref name="propertyURL" binding-name="propertyURL" />
  <resource-ref name="propertyURL" binding-name="propertyURL" />
</web-bnd>

アプリケーションがデプロイされると、WAS を使用して、これらのマッピングをその管理対象リソースにマップできます。ISC コンソールを使用して、環境エントリの値を定義し、それらをアプリケーションにマップします。

WebSphere Liberty Profile により、それがより簡単になりました。WLP が提供するメカニズムについては、私の記事Using @Resource to access JNDI in WebSphere AS 8.5 Liberty Profile で説明しました。

于 2013-03-31T08:31:16.277 に答える
1

次の 3 つのオプションがあります。

  1. プロパティ ファイルを含むディレクトリをクラスパスに含めるように Websphere を構成します。方法はわかりませんが、私たちのアプリケーションは同じことを行うので、可能だと確信しています

  2. プロパティ ファイルを war アーカイブに含めます。あなたはおそらくそれをしたくないでしょう。

  3. クラスローダを使用してプロパティ ファイルをロードする代わりに、ファイル API を絶対パスで使用します。WAS がそれを許可するかどうかは完全にはわかりませんが、アプリケーションのインストール パスなど、実際には気にする必要のないものにアプリケーションが大きく依存するようになるため、とにかく悪い考えです。

于 2013-03-30T07:33:46.000 に答える