如何在 Json 读取 PlayFramework 中添加自定义 ValidationError
how to add custom ValidationError in Json Reads in PlayFramework
我正在使用 play Reads 验证助手 我想在 json 异常的情况下显示一些自定义消息 eg:length 最小然后指定或给定的电子邮件无效,我知道 play 显示像这样的错误消息 error.minLength
但我想显示一条合理的消息,例如请输入大于 1 的字符(或其他字符),这是我的代码
case class DirectUserSignUpValidation(firstName: String,
lastName: String,
email: String,
password: String) extends Serializable
object DirectUserSignUpValidation {
var validationErrorMsg=""
implicit val readDirectUser: Reads[DirectUserSignUpValidation] = (
(JsPath \ "firstName").read(minLength[String](1)) and
(JsPath \ "lastName").read(minLength[String](1)) and
(JsPath \ "email").read(email) and
(JsPath \ "password").read(minLength[String](8).
filterNot(ValidationError("Password is all numbers"))(_.forall(_.isDigit)).
filterNot(ValidationError("Password is all letters"))(_.forall(_.isLetter))
)) (UserSignUpValidation.apply _)
}
我试过这样添加 ValidationError
(JsPath \ "email").read(email,Seq(ValidationError("email address not correct")) and
but its giving me compile time error
too many arguments for method read: (t: T)play.api.libs.json.Reads[T]
请问我如何在读取 json 数据时添加自定义验证错误消息
ValidationError
消息应该是用于翻译的密钥,而不是人类可读的消息。
但是,如果您仍想更改 minLength
的消息,则需要重新实现它,因为它是硬编码的。
幸运的是,源代码是可用的,因此您可以轻松地随意更改它:
def minLength[M](m: Int)(implicit reads: Reads[M], p: M => scala.collection.TraversableLike[_, M]) =
filterNot[M](JsonValidationError("error.minLength", m))(_.size < m)
如果您想使用更通用的模式来指定错误,您唯一的访问权限是使用验证结果。例如,你可以做
val json: JsValue = ???
json.validate[DirectUserSignUpValidation] match {
case JsSuccess(dusuv, _) => doSomethingWith(dusuv)
case JsError(errs) => doSomethingWithErrors(errs)
}
或者,使用更紧凑的方法
json.validate[DirectUserSignUpValidation].
fold(doSomethingWithErrors, doSomethingWith)
游戏中没有(JsPath \ "firstName").read(minLength[String](1))
这样的东西json。您可以对自定义错误消息执行的操作是:
(JsPath \ "firstName").read[String].filter(ValidationError("your.error.message"))(_.length > 0)
我正在使用 play Reads 验证助手 我想在 json 异常的情况下显示一些自定义消息 eg:length 最小然后指定或给定的电子邮件无效,我知道 play 显示像这样的错误消息 error.minLength
但我想显示一条合理的消息,例如请输入大于 1 的字符(或其他字符),这是我的代码
case class DirectUserSignUpValidation(firstName: String,
lastName: String,
email: String,
password: String) extends Serializable
object DirectUserSignUpValidation {
var validationErrorMsg=""
implicit val readDirectUser: Reads[DirectUserSignUpValidation] = (
(JsPath \ "firstName").read(minLength[String](1)) and
(JsPath \ "lastName").read(minLength[String](1)) and
(JsPath \ "email").read(email) and
(JsPath \ "password").read(minLength[String](8).
filterNot(ValidationError("Password is all numbers"))(_.forall(_.isDigit)).
filterNot(ValidationError("Password is all letters"))(_.forall(_.isLetter))
)) (UserSignUpValidation.apply _)
}
我试过这样添加 ValidationError
(JsPath \ "email").read(email,Seq(ValidationError("email address not correct")) and
but its giving me compile time error
too many arguments for method read: (t: T)play.api.libs.json.Reads[T]
请问我如何在读取 json 数据时添加自定义验证错误消息
ValidationError
消息应该是用于翻译的密钥,而不是人类可读的消息。
但是,如果您仍想更改 minLength
的消息,则需要重新实现它,因为它是硬编码的。
幸运的是,源代码是可用的,因此您可以轻松地随意更改它:
def minLength[M](m: Int)(implicit reads: Reads[M], p: M => scala.collection.TraversableLike[_, M]) =
filterNot[M](JsonValidationError("error.minLength", m))(_.size < m)
如果您想使用更通用的模式来指定错误,您唯一的访问权限是使用验证结果。例如,你可以做
val json: JsValue = ???
json.validate[DirectUserSignUpValidation] match {
case JsSuccess(dusuv, _) => doSomethingWith(dusuv)
case JsError(errs) => doSomethingWithErrors(errs)
}
或者,使用更紧凑的方法
json.validate[DirectUserSignUpValidation].
fold(doSomethingWithErrors, doSomethingWith)
游戏中没有(JsPath \ "firstName").read(minLength[String](1))
这样的东西json。您可以对自定义错误消息执行的操作是:
(JsPath \ "firstName").read[String].filter(ValidationError("your.error.message"))(_.length > 0)