Распространенная ошибка с val
- определить переменную после использования:
scala> object test {
| val f = x
| val x = 1
| }
defined module test
scala> println(test.f)
0
Что часто является ошибкой при работе с условиями SiteMap
Лифта (я лично склоняюсь к их определению внизу). Чтобы преодолеть это, определите ваш val
как lazy
:
scala> object test {
| val f = x
| lazy val x = 1
| }
defined module test
scala> println(test.f)
1
примечание
Ваш второй тест в If
не выглядит слишком Scalaish, это смесь функционального и процедурного стилей. Есть варианты, как написать это, смотрите только один из возможных вариантов:
sessionLoginType.is match {
case Full(StudentLogin) =>
println("student")
RedirectResponse("studentHome")
case Full(ProviderLogin) =>
println("provider")
RedirectResponse("providerHome")
}
Другой вариант
Вы можете определить статическую карту от типа входа в систему до uri, например,
val redirectMap = Map(StudentLogin -> "studentHome", ProviderLogin -> "providerHome")
Тогда вы можете использовать его в своем If
как
sessionLoginType.is.flatMap{ redirectMap.get }.map{ RedirectResponse _ }.open_!
то же самое можно переписать, используя for-compitions:
(for {val loginType <- sessionLoginType.is
val uri <- redirectMap.get(loginType) }
yield RedirectResponse(uri)
).open_!
Но будьте осторожны, если redirectMap
не содержит ключа или ваш sessionLoginType
пуст, у вас проблемы - open_!
не удастся, так как его нельзя применять к пустым полям Если вы знаете разумное значение по умолчанию, лучше используйте .openOr defaultRedirect