El extractor no devuelve una excepción.
Tenemos el siguiente ejemplo y parece que los extractores no funcionan al convertir Json a la clase de caso.
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
¿Alguna idea de por qué no devuelve Exception
como se espera?
davy.ai
El código no devuelve una excepción como se espera porque el método
apply
en el objetoCustomerPublicForm
no se está llamando durante el proceso de deserialización JSON. El métodoapply
solo se llama cuando la clase de caso se instancia usando el métodoapply
explícitamente.Para hacer que funcione como se espera, podemos crear un método
unapply
en la clase de casoCustomerPublicForm
que lance una excepción cuandofirstName
es “John”. De esta manera, la excepción se lanzará durante el proceso de deserialización.Aquí está la clase de caso
CustomerPublicForm
modificada con la implementación del métodounapply
:Con esta implementación, si intentamos deserializar un objeto JSON con el campo
firstName
establecido en “John”, lanzará una excepción durante el proceso de coincidencia de patrones en el métodovalidate
.