playframework如何将表单映射到映射[字符串,字符串]
我有一门课playframework如何将表单映射到映射[字符串,字符串],playframework,playframework-2.0,Playframework,Playframework 2.0,我有一门课 case class EventForm(name: String, attrs: Map[String, String]) 我使用play表单映射将json值转换为EventForm implicit val form = Form( mapping( "name" -> nonEmptyText, "attrs" -> of(mapFormatter) )(EventForm.apply)(EventForm.unap
case class EventForm(name: String, attrs: Map[String, String])
我使用play表单映射将json值转换为EventForm
implicit val form = Form(
mapping(
"name" -> nonEmptyText,
"attrs" -> of(mapFormatter)
)(EventForm.apply)(EventForm.unapply) verifying logicConstraint
)
映射格式化程序如下所示:
implicit val mapFormatter = new Formatter[Map[String, String]] {
override def bind(key: String, data: Map[String, String]): Either[Seq[FormError], Map[String, String]] = {
stringFormat.bind(key, data).right.flatMap { value: String =>
// .either(Json.parse(value).as[Map[String, String]]))
// .left.map(e => Seq(FormError(key, "error.signedNumber", Nil)))
Right(Json.parse(value).as[Map[String, String]])
}
}
override def unbind(key: String, value: Map[String, String]): Map[String, String] = {
Map(key -> Json.toJson(value).toString())
}
}
它可以编译,但我会得到一个验证错误,如“attrs required”
}
这里有点棘手,你可以试着打印LN(数据),然后你就会明白为什么了
def mapFormat(errorMessage: String): Formatter[Map[String, String]] = new Formatter[Map[String, String]] {
def bind(key: String, data: Map[String, String]) = {
val map = data
.filterKeys(_.startsWith(s"$key."))
.map(tuple => (tuple._1.substring(key.length + 1), tuple._2))
val mapOpt = if (map.isEmpty) None else Some(map)
mapOpt.toRight(Seq(FormError(key, errorMessage, Nil)))
}
def unbind(key: String, value: Map[String, String]) = Map(key -> Json.toJson(value).toString())