2013-02-20 9 views
7

質問:どのように定義されていても(設定、コマンドライン引数、またはまったく)、再生中のポート番号を取得するにはどうすればよいですか。Play Framework 2アプリケーションのポート番号の取得

この回答はRetrieving port number in-application using Play Frameworkである必要があります。そのコードはコンパイルされないため、再生v1にする必要があります。

プレイ2では、Javaがあります:少なくともいないすべてのケースでは、実際のポート番号を返しません

Integer port = Play.application().configuration().getInt("http.port"); 

。 Playが次のように実行される場合:nullを返します。

プレイが

run -Dhttp.port 80 -Dhttp.address=example.com 

として実行されている場合は、デフォルトポート(9000)の開始を再生します。 biesiorが指摘したように

それが二回ポートを言及することによって動作します:

1の再生が実際に使用するものであり、他方はそれが報告するものであるため、当然のことながら、最適ではない
play -Dhttp.port=80 "run 80" 

しかし、それはdevモードのために私の質問に答えるでしょう。しかし、ドキュメンテーションによれば、再生ではrunを使用して決して実行するべきではありません。だから、startコマンドと同等のものはありますが、より安全で安全な方法はありませんか? (私はJavaバージョンに興味があるが、他の人があまりにもスカラ座について知りたいかもしれません。)DEVモードで実行されている

+0

ちょうどメモ...あなたは本当にあなたがUnix上でポート80でPlayを実行すべきではありません。このためには、Playをrootとして実行する必要があります。これは安全なものではありません。 –

答えて

3

あなたは残念ながらあなたがデフォルトのために同じことをしなければならない倍増表記

play -Dhttp.port=80 "run 80" 

を使用する必要がありますポート

play -Dhttp.port=9000 "run 9000" 

だから、僕はすべての必要なのparamsと簡単な出発のために(Windowsの場合または.BAT)シェルスクリプトを書くことをお勧めします。

+1

プロダクションでは、 'start'コマンド(引数なし)を使って、実際の' 9000'の代わりに 'null'を取得します。 –

0

私はこのScalaスニペットを使ってPlayのリスンポートを決定しています。残念ながら、-Dhttp.port=...が指定されていない場合、いくつかのデフォルト値をハードコードする必要がありました。

val listenPort = 
    if (!Play.isTest) { 
    System.getProperty("http.port", "9000") 
    } 
    else { 
    // Not on classpath: play.api.test.Helpers.testServerPort 
    // Instead, duplicate its implementation here: 
    System.getProperty("testserver.port", "19001") 
    } 

さらに良い方法がないかと思います。 Play.portしかし、私は何も見つかっていない - だけでなく

:-)あなたの質問を除いて(あなたの例では、それは -Dhttp.port=80ない -Dhttp.port 80でなければなりません。)私はどんなにポートを取得しないための方法を見つけた

0

ポートが指定されています。逆のルートを使用してCallオブジェクトを取得し、absoluteUrl()メソッドを使用して、ポートを含むアクションの絶対URLを取得します。コードスニペット:

public class RouteController extends Controller { 
public Promise<Result> getPortAction() { 
    Call call = com.mycom.routes.RouteController.getPortAction(); 
    String absoluteUrl = call.absoluteURL(request()); 
    //Here absoluteUrl would be like http://localhost:9002/...., 9002 would be the port. 
    ... 
} } 
+1

このコードサンプルを改良することができれば、あなたの回答をアップアップします。あなたが暗示しているように、設定を調べるのには最適ではありません。ポート番号を探しているとき。原則として、あなたの答えは理想的ですが、私はそれを働かせることができませんでした。 –

+0

"absoluteURL()"メソッドは実際にはURIのローカルパスセクションのみを計算するため、これはまったく役に立ちません。サーバーとポートは省略されるか、または "absoluteURL()"のパラメータに含まれるものに設定されます。 –

関連する問題