2014-03-06 4 views
10

Ich versuche, einen optionalen Abfrage-Parameter zu definieren, die auf ein Long abbildet, wird aber null sein, wenn es nicht in der URL ist:assign null Standardwert für optionale Abfrage param in Route - Spiele Rahmen

GET /foo controller.Foo.index(id: Long ?= null) 

... und ich möchte im wesentlichen überprüfen, ob es in oder nicht bestanden wurde:

:

public static Result index(Long id) { 
    if (id == null) {...} 
    ... 
} 

jedoch einen Kompilierungsfehler ich bin immer

Warum kann ich dies nicht tun, indem ich null als Standardwert für einen erwarteten Long optionalen Abfrageparameter zuweisen? Was ist eine alternative Möglichkeit, dies zu tun?

Antwort

23

Denken Sie daran, dass der optionale Abfrageparameter in Ihrer Route vom Typ scala.Long ist, nicht java.lang.Long. Der Long-Typ von Scala entspricht dem Java-Primitiv long und kann nicht mit dem Wert null belegt werden.

id Ändern des Typs sein java.lang.Long sollte die Kompilierung Fehler beheben, und ist vielleicht der einfachste Weg, um Ihr Problem zu lösen:

GET /foo controller.Foo.index(id: java.lang.Long ?= null) 

Sie auch id in einer Scala versuchen könnte Option Einwickeln, da dies der empfohlene Weg in Scala zur Handhabung optionaler Werte. Ich glaube jedoch nicht, dass Play ein optionales Scala Long einem optionalen Java Long (oder umgekehrt) zuordnen wird. Sie werden entweder einen Java-Typen in der Route haben müssen:

GET /foo controller.Foo.index(id: Option[java.lang.Long]) 

public static Result index(final Option<Long> id) { 
    if (!id.isDefined()) {...} 
    ... 
} 

Oder einen Scala Typen in Java-Code:

GET /foo controller.Foo.index(id: Option[Long]) 

public static Result index(final Option<scala.Long> id) { 
    if (!id.isDefined()) {...} 
    ... 
} 
+0

hey @avik ... wie würde die Methodendeklaration für dieses 'Option [Long]' Ding ... aussehen? – Hristo

+0

@Hristo - Ich habe meine Antwort aktualisiert und konkretisiert. – avik

1

In meinem Fall verwende ich ein String-Variable.

Beispiel:

In meiner Route:

GET /foo controller.Foo.index(id: String ?= "")

Dann konvertiere ich in meinem Code mit einem Parser nach Long -> Long.parseLong.

Aber ich stimme zu, dass die Methode von Hristo die beste ist.

Verwandte Themen