Присвоить значение null по умолчанию для необязательного параметра запроса в маршруте - Play Framework

Я пытаюсь определить необязательный параметр запроса, который будет отображаться в Long, но будет null, когда он отсутствует в URL-адресе:

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

... и я действительно хочу проверить, было ли оно передано или нет:

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

Однако я получаю ошибку компиляции:

несоответствие типов; найдено: Нулевое (нулевое) обязательное условие: Длительный Обратите внимание, что неявный конверсии неприменимы, поскольку они неоднозначны: оба метода Long2longNullConflict в классе LowPriorityImplicits типа (x: Null) Длинные и метод Long2long в объекте Predef типа (x: Long) Long являются возможными функциями преобразования от Null (null) до Long

Почему я не могу это сделать, присваивая null значение по умолчанию для ожидаемого параметра Long необязательного запроса? Какой альтернативный способ сделать это?

Ответ 1

Помните, что необязательный параметр запроса в вашем маршруте имеет тип scala.Long, а не java.lang.Long. Scala Длинный тип эквивалентен примитиву Java long и не может быть присвоен значение null.

Изменение id на тип java.lang.Long должно исправить ошибку компиляции и, возможно, самый простой способ решить вашу проблему:

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

Вы также можете попробовать обернуть id в Scala Option, увидев, что это рекомендуется в Scala для обработки необязательных значений. Однако я не думаю, что Play отобразит необязательный Scala Long для необязательного Java Long (или наоборот). Вам либо придется иметь тип Java на вашем маршруте:

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

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

Или введите Scala в код Java:

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

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

Ответ 2

В моем случае я использую переменную String.

Пример:

В моем маршруте:

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

Затем я конвертирую в свой код с парсером в Long → Long.parseLong.

Но я согласен, что метод Христо самый лучший.