【问题标题】:Extractor does not return exception提取器不返回异常
【发布时间】:2022-01-07 05:12:26
【问题描述】:

我们有以下示例,似乎提取器在将 Json 转换为案例类时不起作用。

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

【问题讨论】:

    标签: scala play-json


    【解决方案1】:

    代码不会抛出Exception(这可能不是一个好主意),因为json 输入是有效的,所以.validate 返回CustomerPublicForm(John,Doe)

    【讨论】:

    • 感谢您的回答。切换到 scala 2,它按预期工作。
    【解决方案2】:

    Json.reads[CustomerPublicForm] 似乎绕过了您的 apply 方法。

    我不确定 Play 的宏读取生成的确切细节,但它可能只是针对您的类构造函数而不是 apply 方法。由于您编写的 apply 方法与现有构造函数具有相同的签名,因此您最好将验证(抛出异常)逻辑移入构造函数并删除自定义 apply

    或者,您可以使用 不同的 签名自定义apply(在这种情况下它没有意义,但我在这里一般说),然后使用非宏代码实现该类的读取。

    【讨论】:

    • 感谢您的回答。切换到 scala 2,它按预期工作。
    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2020-01-26
    • 2020-01-31
    • 2010-10-05
    • 1970-01-01
    • 2022-07-07
    相关资源
    最近更新 更多