使用Java URI验证case类中的url

时间:2018-04-30 15:41:09

标签: java scala validation playframework

我有一个案例类:

case class ProfileUrl
(
  profileId : Long,
  socialUrl : String
)

implicit val profileUrlJsonFormat : Format[ProfileUrl] = Json.format[ProfileUrl]

我想验证socialUrl是否包含有效的网址。我正在考虑使用java.net.URLjava.net.URI。我宁愿不为我需要在我从json实例化所述类时运行的URL创建自定义验证器。有没有办法通过包装URL或创建自定义json解析器来做到这一点?无论哪种方式,我将如何做这样的事情?

1 个答案:

答案 0 :(得分:0)

一个选项是使用URL regular expressionReads.pattern来定义socialUrl字符串值的正则表达式约束,如下所示:

import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._

case class ProfileUrl(
  profileId : Long,
  socialUrl : String
)

object ProfileUrl {
  val urlRegex =
    """((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)""".r

  implicit val profileUrlReads: Reads[ProfileUrl] = (
    (JsPath \ "profileId").read[Long] and
    (JsPath \ "socialUrl").read[String](pattern(urlRegex, "Malformed URL"))
  )(ProfileUrl.apply _)
}

object UrlJsonValidationExample extends App {
  val str = """{"profileId": 123, "socialUrl": "www.example.com"}"""
  val json = Json.parse(str)
  val profileUrl = json.as[ProfileUrl]
  println(profileUrl)
}