Присвоить значение 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.
Но я согласен, что метод Христо самый лучший.