gpt4 book ai didi

scala - 在 Scala Play 应用程序中避免此 java.lang.ClassCastException 错误的正确应用和取消应用方法是什么?

转载 作者:行者123 更新时间:2023-12-01 16:50:35 24 4
gpt4 key购买 nike

我正在构建一个 Scala Play 应用程序,其中事件和数据以 Json 格式保存,我正在尝试对用户和分配给他们的角色进行建模。我的想法是将 Roles 建模为案例对象,因为每个标准角色只需要为应用程序中的所有用户定义一次,我想对特定用户拥有的角色类型进行模式匹配被分配。到目前为止,我有这个;

package models

abstract class User {
def displayName: String
def role: Role
}

case class GuestUser(displayName: String, role: Role) extends User {
}

case class RegisteredUser(displayName: String, role: Role) extends User {
}

trait Role { // have tried abstract class too - but like idea of developing stackable traits for role permissions
}
object Role {
implicit val RoleTypeFormat: Format[Role] = Json.format[Role]
def apply(className: String): Role = Class.forName(className: String).asInstanceOf[Role]
def unapply(role: Role): Option[String] = Option(this.getClass.getName) // have also tried .getSimpleName
}

case object GuestUserRole extends Role {
}

case object RegisteredUserRole extends Role {
}

如果我没有在 object Role 中定义 apply 和 unapply 方法,并且只依赖于使用 Json.format[Role] 的隐式值,我得到“未找到应用函数”或“未找到未应用函数”错误 - 所以我添加了它们,以尝试消除此错误。

如果不将 .asInstanceOf[Role] 添加到 Role apply 方法,我无法编译它。它现在可以编译,但是当我尝试设置一个新的 RegisteredUser 实例的 role: Role 参数时,

val role: Role = RegisteredUserRole

创建了一个新的 RegisteredUser 实例,其中角色属性被序列化为 Json 为;

"role":{"className":"models.Role$”}

但是当我尝试反序列化它时,我得到 Exception in thread "pool-4868-thread-1"java.lang.ClassCastException: java.lang.Class cannot be cast to models.Role

我的目标是最终得到相同的 RegisteredUser 实例(或 GuestUser 实例),这样我就可以在 View Controller 中按照以下方式进行模式匹配;

def isAuthorized: Boolean = { 
role match {
case RegisteredUserRole => true
case GuestUserRole => false
// etc
}
}

如有任何帮助和建议,我们将不胜感激。我在 Scala 和 Play 方面的技能和知识还不够丰富,无法确定我是否走在正确的用户和角色建模轨道上。

最佳答案

正如@lmm 所建议的,最好提供自定义的 Format[Role] 而不是尝试以奇怪的方式创建实例。

像这样:

implicit val fmt = new Format[Role] {

def reads(js: JsValue): JsResult[Role] = {
js.validate[String] fold (
error => JsError(error),
role => role match {
case "GuestUserRole" => JsSuccess(GuestUserRole)
case "RegisteredUserRole" => JsSuccess(RegisteredUserRole)
case _ => JsError(Nil) // Should probably contain some sort of `ValidationError`
}
)
}

def writes(r: Role): JsValue = JsString(r.toString)
}

关于scala - 在 Scala Play 应用程序中避免此 java.lang.ClassCastException 错误的正确应用和取消应用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27565189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com