11

.NET から Java コードを呼び出せるように、いくつかの単純な Java Web サービスを作成しようとしています。これまでのところ、Glassfish で動作する概念実証を取得しました。IDE がすべての作業を行う場合は、非常に簡単です。

今、私は本当に単純であるべきJava のことで行き詰っています。たとえば、再コンパイルせずに接続文字列/ユーザー名/アプリケーション変数などを変更できるように、構成を外部化したいと考えています。

.NET では、Web サイトのルートにある web.config ファイルにいくつかの文字列を貼り付けて、次を使用します。ConfigurationManager.AppSettings["whateverIwant"];

java.util.Properties を取得して (スタンドアロン クライアントから) 必要な処理を実行できますが、.properties ファイルを配置する場所と、Web サービス内からファイルへのパスを取得する方法がわかりません。

WebSphere Application Server 内でも機能するには、私のアプローチが必要です。ありがとう!

4

5 に答える 5

7

他の人が述べたように、コンテナに大きく依存しますが、ほとんどの場合、動的構成は XML または .properties ファイルではなくデータベースに保存されます。

これは概念実証のようなものであることがわかったので、ここに簡単で汚い解決策があります: (本番コードではこれを行わないでください) システム プロパティを使用します。欠点: 変更のたびにコンテナーを再起動する必要がありますが、アプリを再コンパイルする必要はありません。

Glassfish でシステム プロパティを使用するには、「構成 -> システム プロパティ」セクションに移動して、そこにプロパティを追加します。次に、アプリケーション内から呼び出すだけです

String myValue = System.getProperty("myProperty");

値を取得します。すべての Java アプリケーションがこれらのプロパティをサポートしていますが、Websphere でそれらを構成する方法がわかりません。

于 2011-11-07T22:40:51.323 に答える
5

残念ながら、Java EEには、アプリケーション構成に関して頭に大きな穴があります。

あなたの最善の策は次のいずれかです:

  • JNDIを使用して、構成をアプリケーションサーバー環境に格納します。これは、移植可能で、苦痛を伴い、ユーザーが構成を行うための絶対的な悪夢です。構成UIは、使用されているアプリサーバーとバージョンによって異なり、そのアプリサーバーに固有のコマンドラインのみのユーティリティである場合があります。

  • Preferences APIを使用して構成を保存し、独自のUIを作成して編集します。これはOKです...設定がフラッシュされて再初期化されるタイミングを制御できないことを除いて。一部のアプリサーバーは、アプリが再デプロイされたときにこれを実行しますが、これはおそらく望ましくありません。

全体として、状況は絶対に悪臭を放ちます。アプリサーバーがアプリにシンプルなプロパティマップとUIを提供し、アプリサーバーの管理ツールを使用してアプリを編集するためのクリーンで賢明な方法はありません。

Webコンテキストパラメータを使用してこれを回避しようとしましたが、それらもバグがあることがわかりました。Glassfishは、設定されていた最初のWebコンテキストパラメータ以上のものを無視していました。また、サーブレットコンテキストがないとアクセスが困難であったため、アプリ全体で簡単にアクセスできませんでした。

誰かがより良い答えを持っているなら、私はそれを聞きたいです。なぜなら、それが立っている状況は、いくつかの主要な反復を経てきたスペックにとって実に驚くべきもののように見えるからです。

参照:JavaEEアプリケーションの構成の保存と編集

于 2011-11-04T11:23:46.370 に答える
3

残念ながら、アプリケーションの構成はコンテナーに依存します。通常、JNDIを介して構成にアクセスします。私が最近使用したアプローチは次のとおりです。

  • データベースをアプリで利用できるようにします(JNDIを介して、Glassfishデータベース「ウィザード」を使用します)。これは一部、コンテナに依存します。
  • データベースから設定を逆シリアル化するエンティティBeanを作成します。ここでの簡単な解決策は、次のようなものにすることです。
@実在物
パブリッククラス設定{
  @Id
  プライベート文字列名。
  プライベート文字列値;
  ..。
}

次に、それは行うことの問題ですem.find(Setting.class, "whateveriwant").getValue()。または、すべての設定を属性として使用して単一のエンティティBeanを作成することもできます。いずれにせよ、このアプローチはコンテナの依存関係を最小限に抑えます。

于 2009-09-28T00:52:07.300 に答える
2

私がこれまでに見つけた最良の解決策は、「EAC4J (External Application Configuration For Java)」です。私は多くのプロジェクトで成功裏に使用してきました。

于 2012-05-24T07:21:22.960 に答える