assign null default value for optional query param in route - Play Framework

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?

Answers


Remember that the optional query parameter in your route is of type scala.Long, not java.lang.Long. Scala's Long type is equivalent to Java's primitive long, and cannot be assigned a value of null.

Changing id to be of type java.lang.Long should fix the compilation error, and is perhaps the simplest way to resolve your issue:

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

You could also try wrapping id in a Scala Option, 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:

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

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

Or a Scala type in your Java code:

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

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

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.


Need Your Help

localize android application where data coming from server

android localization internationalization

i have an application where it displays a list of items in ListView. These items(strings) are coming from the server which are stored in English language. I want to display these English characters...

AngularJs with large JSON array

javascript arrays json angularjs

1Ok so I'm developing an application that has a Parent-Child hierarchy using AngularJs to bind the data received from the RESTFUL web service to the view.