PlayFramework:表正则表达式验证
问题描述:
我要开发具有正则表达式的使用和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
一切都很好。
问题是如何正确使用正则表达式自定义验证?
感谢
答
您会收到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
看到这个答案:http://*.com/questions/24367718/custom-regex-validation-in-play-framework-scala/24368253#24368253 – 2014-09-23 12:54:58
一切正常,更改订单。在'val anForm ='行之前添加'val alphaNumCheck:Mapping [String] ='。 – 2014-09-23 13:47:53