2014-09-23 130 views
1

我要開發具有正則表達式的使用和Forms一個自定義的驗證中發揮2.3 根據官方文檔我已經開發:PlayFramework:表正則表達式驗證

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一切都很好。

問題是如何正確使用正則表達式自定義驗證?

感謝

+0

看到這個答案:http://stackoverflow.com/questions/24367718/custom-regex-validation-in-play-framework-scala/24368253#24368253 – 2014-09-23 12:54:58

+1

一切正常,更改訂單。在'val anForm ='行之前添加'val alphaNumCheck:Mapping [String] ='。 – 2014-09-23 13:47:53

回答

3

您會收到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 = [email protected] 

scala> instance.a 
res3: String = null 

問題是與初始化順序。在b之前創建了a - 在線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 = [email protected] 

scala> instance.a 
res4: String = AA