我們有以下示例,似乎提取器在將 Json 轉換為 case 類時不起作用。
import play.api.libs.json.Reads._
import play.api.libs.json._
import play.api.libs.json.Format.GenericFormat
val json: JsValue = Json.parse("""
{
"firstName" : "John",
"lastName" : "Doe"
}
""")
trait BasePublicForm {
def firstName: String
def lastName: String
}
case class CustomerPublicForm(firstName: String, lastName: String) extends BasePublicForm
case class LeadPublicForm(firstName: String, lastName: String ) extends BasePublicForm
object CustomerPublicForm {
implicit val writesPublicLeadFormRequest: Writes[CustomerPublicForm] = Json.writes[CustomerPublicForm]
implicit val readsPublicLeadFormRequest: Reads[CustomerPublicForm] = Json.reads[CustomerPublicForm]
def apply(firstName: String, lastName: String): CustomerPublicForm = {
if(firstName.equalsIgnoreCase("John")) {
throw new Exception("John Exception")
}
new CustomerPublicForm(firstName, lastName)
}
}
object LeadPublicForm {
def apply(firstName: String, lastName: String): LeadPublicForm = {
new LeadPublicForm(firstName, lastName)
}
}
val s = json.validate[CustomerPublicForm] match {
case JsSuccess(form, _) => {
form
// do something with place
}
case e: JsError => {
// error handling flow
throw new Exception("Error")
}
}
s
鏈接 -> https://scastie.scala-lang.org/eZrHTOVkQvSUJmoAJMTXfQ
任何想法為什么它沒有Exception按預期回傳?
uj5u.com熱心網友回復:
代碼不會拋出Exception(無論如何這可能不是一個好主意),因為json輸入是有效的,因此.validate回傳CustomerPublicForm(John,Doe)
uj5u.com熱心網友回復:
在Json.reads[CustomerPublicForm]似乎是繞過你的apply方法。
我不確定 Play 宏讀取生成的確切細節,但它可能只是直接用于您的類建構式而不是apply方法。由于apply您撰寫的方法與現有建構式具有相同的簽名,因此如果您將驗證(例外拋出)邏輯移到建構式中并僅洗掉自定義apply.
或者,您可以apply使用不同的簽名進行自定義(在這種情況下這并不有意義,但我在這里一般來說),然后使用非宏代碼來實作該類的讀取。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/372708.html
