PlayFramework: проверка регулярного выражения формы

Я собираюсь разработать пользовательскую проверку с использованием регулярных выражений и Forms в игре 2.3. Согласно официальной документации, которую я разработал:

  case class AlphaNumeric(str: String)

  val anForm = Form(
    mapping(
      "str" -> alphaNumCheck
    )(AlphaNumeric.apply)(AlphaNumeric.unapply)
  )

  val numberConstraint = """\d+""".r
  val alphaNumConstraint: Constraint[String] = Constraint("constraints.password")({
    plainText =>
      val errors = numberConstraint.findFirstIn(plainText) match {
        case None => Nil
        case Some(_) => Seq(ValidationError("Need to contain at least one number"))
      }
      if (errors.isEmpty) {
        Valid
      } else {
        Invalid(errors)
      }
  })

  val alphaNumCheck: Mapping[String] = nonEmptyText.verifying(alphaNumConstraint)

  def alphaNumAction() = Action {
    implicit request => {

      anForm.bindFromRequest fold (
        formWithErrors => {
          BadRequest(anForm.errorsAsJson)
        },
        newAccountInfo => {
          Ok(Json.obj("message" -> "success"))
        }
      )
    }
  }

Но когда я делаю вызов этого действия, я получаю 500 ошибок внутреннего сервера.

Internal server error, for (POST) [/alpha] ->

java.lang.ExceptionInInitializerError: null
    at Routes$$anonfun$routes$1$$anonfun$applyOrElse$3$$anonfun$apply$3.apply(routes_routing.scala:137) ~[na:na]
    at Routes$$anonfun$routes$1$$anonfun$applyOrElse$3$$anonfun$apply$3.apply(routes_routing.scala:137) ~[na:na]
    at play.core.Router$HandlerInvokerFactory$$anon$13$$anon$14.call(Router.scala:217) ~[play_2.11-2.3.2.jar:2.3.2]
    at play.core.Router$Routes$TaggingInvoker.call(Router.scala:464) ~[play_2.11-2.3.2.jar:2.3.2]
    at Routes$$anonfun$routes$1$$anonfun$applyOrElse$3.apply(routes_routing.scala:137) ~[na:na]
Caused by: java.lang.NullPointerException: null
    at play.api.data.ObjectMapping5.<init>(ObjectMappings.scala:272) ~[play_2.11-2.3.2.jar:2.3.2]
    at play.api.data.Forms$.mapping(Forms.scala:77) ~[play_2.11-2.3.2.jar:2.3.2]
    at controllers.AccountController$.<init>(AccountController.scala:71) ~[na:na]
    at controllers.AccountController$.<clinit>(AccountController.scala) ~[na:na]
    at Routes$$anonfun$routes$1$$anonfun$applyOrElse$3$$anonfun$apply$3.apply(routes_routing.scala:137) ~[na:na]
[error] application - Error while rendering default error page

Когда я меняю пользовательский alphaNumCheck на какой-то стандарт, например. nonEmptyText все в порядке.

Вопрос в том, как правильно сделать пользовательскую проверку с помощью регулярных выражений?

Спасибо


person Alex Fruzenshtein    schedule 23.09.2014    source источник
comment
См. этот ответ: stackoverflow.com/questions/24367718/   -  person Michael Zajac    schedule 23.09.2014
comment
Все в порядке, измените порядок. Добавьте val alphaNumCheck: Mapping[String] = перед строкой val anForm =.   -  person Andrzej Jozwik    schedule 23.09.2014


Ответы (1)


Вы получаете NullPointerException - alphaNumCheck равно null. Переехать

val alphaNumCheck: Mapping[String] = nonEmptyText.verifying(alphaNumConstraint) 

до вершины val anForm =

См. простой пример:

scala> :pa
// Entering paste mode (ctrl-D to finish)

class A {

val a = b

val b = "AAA"

}

// Exiting paste mode, now interpreting.

<console>:9: warning: Reference to uninitialized value b
       val a = b
               ^
defined class A

scala> val instance = new A
instance: A = A@4ac68d3e

scala> instance.a
res3: String = null

Проблема с порядком инициализации. a создается до b - в строке val a = b b имеет значение null.

Если я добавлю lazy, все будет в порядке.

scala> :pa
// Entering paste mode (ctrl-D to finish)

class A {

lazy val a = b

val b = "AA" 
}

// Exiting paste mode, now interpreting.

defined class A

scala> val instance = new A
instance: A = A@d7b1517

scala> instance.a
res4: String = AA
person Andrzej Jozwik    schedule 23.09.2014