2013-02-20 7 views
7

Die Frage ist: Wie bekomme ich die Portnummer, die Wiedergabe überwacht, egal wie es definiert wurde (Konfiguration, Befehlszeilenargument oder überhaupt nicht).Abrufen der Portnummer in Play Framework 2 App

Diese Antwort Retrieving port number in-application using Play Framework muss für Play v1 sein, da dieser Code nicht kompiliert.

Im Play 2 Java gibt es:

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

Das ist nicht die tatsächliche Portnummer zurückkehrt, zumindest nicht in allen Fällen. Wenn Wiedergabe als ausgeführt wird:

run 80 -Dhttp.address=example.com 

Dann gibt es null.

Wenn Wiedergabe als

ausgeführt wird
run -Dhttp.port 80 -Dhttp.address=example.com 

startet die Wiedergabe auf dem Standard-Port (9000).

Wie biesior wies darauf hin, es funktioniert durch den Hafen zu erwähnen zweimal:

play -Dhttp.port=80 "run 80" 

Was natürlich nicht optimal ist, da man ist, was Spielen tatsächlich verwendet wird, und das andere ist, was es berichtet.

Aber es würde meine Frage für den Entwicklermodus beantworten. Wie in der Dokumentation erwähnt, sollte Play nie mit run in prod ausgeführt werden. Also, was ist das Äquivalent für den Befehl start, und gibt es keinen besseren, sichereren Weg? (Ich habe Interesse an der Java-Version, aber andere vielleicht gefallen auch über Scala wissen.)

+0

Nur eine Anmerkung ... Sie sollten Play auf Port 80 (mindestens auf Unix) wirklich nicht laufen lassen. Da Sie Play als root ausführen müssen, ist das nicht sicher. –

Antwort

3

Laufen in dev-Modus müssen Sie

verdoppelt Notation verwenden
play -Dhttp.port=80 "run 80" 

Leider haben Sie für Standard das gleiche zu tun

Port
play -Dhttp.port=9000 "run 9000" 

Deshalb schlage ich nur Shell-Skript (oder .bat in Windows) für leichten Start mit allen erforderlichen params zu schreiben.

+1

In der Produktion, mit dem 'start' Befehl (keine Argumente), bekomme ich immer noch' null' anstelle der tatsächlichen '9000'. –

0

Ich verwende dieses Scala-Snippet, um Play's Listenport zu bestimmen. Leider musste ich einige Standardwerte fest codieren, falls -Dhttp.port=... nicht angegeben ist.

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") 
    } 

Ich frage mich auch, ob es keinen besseren Weg gibt, z.B. Play.port aber ich habe nichts gefunden - gut, außer für Ihre Frage :-)

(In Ihrem Beispiel soll es -Dhttp.port=80 nicht -Dhttp.port 80 sein.)

0

Ich fand nur einen Weg, den Hafen, egal zu bekommen, wie Der Port ist angegeben. Verwenden Sie die umgekehrte Route, um ein Call-Objekt zu erhalten, und verwenden Sie die absoluteUrl() -Methode, um die absolute URL Ihrer Aktion abzurufen, die den Port enthält. Code-Schnipsel:

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

Ich werde Ihre Antwort auffrischen, wenn Sie dieses Codebeispiel verfeinern können. Wie Sie implizieren, ist es am besten _not_ die Config abzufragen. wenn Sie die Portnummer suchen. Im Prinzip ist deine die ideale Antwort, aber ich konnte es nicht funktionieren lassen. –

+0

Das hilft überhaupt nicht, da die Methode "absoluteURL()" nur den lokalen Pfadabschnitt des URI berechnet. Server und Port werden entweder weggelassen oder auf die Parameter von "absoluteURL()" gesetzt. –