I'm trying to define an optional query parameter that will map to a Long
, but will be null
when it is not present in the URL:
GET /foo controller.Foo.index(id: Long ?= null)
... and I essentially want to check if it was passed in or not:
public static Result index(Long id) {
if (id == null) {...}
...
}
However, I'm getting a compilation error:
type mismatch; found : Null(null) required: Long Note that implicit conversions are not applicable because they are ambiguous: both method Long2longNullConflict in class LowPriorityImplicits of type (x: Null)Long and method Long2long in object Predef of type (x: Long)Long are possible conversion functions from Null(null) to Long
Why can't I do this, assigning null
to be a default value for an expected Long
optional query parameter? What's an alternative way to do this?
In my case I use a String variable.
Example :
In my route :
GET /foo controller.Foo.index(id: String ?= "")
Then I convert in my code with a parser to Long --> Long.parseLong.
But I agree that the method of Hristo is the best.
Remember that the optional query parameter in your route is of type
scala.Long
, notjava.lang.Long
. Scala's Long type is equivalent to Java's primitivelong
, and cannot be assigned a value ofnull
.Changing
id
to be of typejava.lang.Long
should fix the compilation error, and is perhaps the simplest way to resolve your issue:You could also try wrapping
id
in a ScalaOption
, seeing as this is the recommended way in Scala of handling optional values. However I don't think that Play will map an optional Scala Long to an optional Java Long (or vice versa). You'll either have to have a Java type in your route:Or a Scala type in your Java code: