es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El código no devuelve una excepción como se espera porque el método apply en el objeto CustomerPublicForm no se está llamando durante el proceso de deserialización JSON. El método apply solo se llama cuando la clase de caso se instancia usando el método apply explícitamente.

    Para hacer que funcione como se espera, podemos crear un método unapply en la clase de caso CustomerPublicForm que lance una excepción cuando firstName 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étodo unapply:

    case class CustomerPublicForm(firstName: String, lastName: String) extends BasePublicForm {
      def unapply(form: CustomerPublicForm): Option[CustomerPublicForm] = {
        if (form.firstName.equalsIgnoreCase("John")) {
          throw new Exception("John Exception")
        } else {
          Some(form)
        }
      }
    }
    

    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étodo validate.

Comments are closed.