Spring MVCを使用してJava Webアプリを作成しています。データベースを通過し、ユーザーに電子メールで送信する必要がある通知を見つけるバックグラウンドプロセスがあります。これらの電子メールメッセージにはアプリケーションへのハイパーリンクを含めるには、これはWebアプリのかなり一般的なパターンのように見えますが、問題があります。
サーバー名とコンテキストパスを使用して、アプリケーションの完全修飾URLを取得するにはどうすればよいですか?これは、Webリクエストへの応答ではなく、バックグラウンドプロセスとして実行しているため、HttpServletRequestのメソッドにはアクセスできません。できることは、ServletContextにアクセスすることです。
現在、ベースURLを構成ファイルに入れて起動時に読み取りますが、このアプリケーションはライセンスされ、顧客のアプリケーションサーバーに展開されます。可能であれば、手動で構成する必要はありません。
特にServletRequestに基づいて、実行時にURLを動的に準備することはお勧めしません。これは主に、ユーザーがアプリケーションにアクセスするために使用するURLがわからないためです。アプリケーションサーバーは、Webサーバー、ファイアウォール、またはロードバランサーの背後にある可能性があります。短くするために、ネットワークトポロジを予測することはできません。
プロパティファイルからURLを取得する現在の手法は、上記の問題を解決するのに十分です。特に、管理コンソールが設置されている場合や、関連するオプションがある場合は、メールに表示されるURLを管理する管理コンソールの提供を検討する必要があります。
編集:私の最後のポイントは、トニーが話したことを反映しています。
構成ファイルが存在しない場合(たとえばWEB-INFフォルダー内にある場合、アプリケーションの最初の実行時に表示されるセットアップWebページがないのはなぜですか。ServletContextを使用して、getRealPathを呼び出し、ファイルの実際のパスを取得し、存在するかどうかを確認します()。存在する場合はアプリの開始ページにリダイレクトし、存在しない場合は管理ページを開きます)。
ServletContextでできることは、web.xmlからいくつかの設定を読み取り、コンテキストパスを取得することです。HttpRequestのみがFQ URLを提供できます。
次のようなものを使用できると思います。
String Host = InetAddress.getLocalHost().getCanonicalHostName();
String appUrl = String.format("http://%s:%s%s", Host, port, contextPath);
servletContextのポートとcontextPathを使用します。
サーブレット2.5が getContextPath() をServletContext
に追加しました。 EE依存バージョンを確実に更新すると、問題が解決するはずです。
詳細はこちら:
ServletContextがHttpServletContextのインスタンスではない場合、デバッガで確認しましたか?もしそうなら、それをキャストし、そこから情報を取得します。