首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在默认情况下初始化构造函数参数时,如何从Json创建实例?

在默认情况下初始化构造函数参数时,如何从Json创建实例?
EN

Stack Overflow用户
提问于 2015-01-08 13:43:42
回答 1查看 598关注 0票数 2

ADSRegistrationMap中的方法用于从MongoDB保存和检索文档。ObjectId是在初始化期间创建的。为了从Json加载注册(这是POST主体的一部分),我必须做同样的事情,所以我想我可以添加ADSRegistrationProtocol对象来完成这个任务。它因编译错误而失败。有什么办法解决这个问题或者做得更好吗?

代码语言:javascript
复制
package model

import spray.json._
import DefaultJsonProtocol._
import com.mongodb.casbah.Imports._
import org.bson.types.ObjectId
import com.mongodb.DBObject
import com.mongodb.casbah.commons.{MongoDBList, MongoDBObject}

case class Registration(
  system: String, 
  identity: String, 
  id: ObjectId = new ObjectId())

object RegistrationProtocol extends DefaultJsonProtocol {
  implicit val registrationFormat = jsonFormat2(Registration)
}

object RegistrationMap {
  def toBson(registration: Registration): DBObject = {
    MongoDBObject(
      "system"         -> registration.system,
      "identity"       -> registration.identity,
      "_id"            -> registration.id
    )
  }

  def fromBson(o: DBObject): Registration = {
    Registration(
      system = o.as[String]("system"),
      identity = o.as[String]("identity"),
      id = o.as[ObjectId]("_id")
    )
  }
}

编译错误:

代码语言:javascript
复制
[error] /model/Registration.scala:20: type mismatch;
[error]  found   : model.Registration.type
[error]  required: (?, ?) => ?
[error]  Note: implicit value registrationFormat is not applicable here because it comes after the application point and it lacks an explicit result type
[error]   implicit val registrationFormat = jsonFormat2(Registration)
[error]                                                    ^
[error] one error found
[error] (compile:compile) Compilation failed

将ObjectId更新为String,将jsonFormat2更新为jsonFormat3以修复编译错误。

代码语言:javascript
复制
case class Registration(
  system: String, 
  identity: String, 
  id: String = (new ObjectId()).toString())

object RegistrationProtocol extends DefaultJsonProtocol {
  implicit val registrationFormat = jsonFormat3(Registration)
}

当将POST请求的主体转换为注册对象时,现在获取运行时错误。有什么想法吗?

代码语言:javascript
复制
val route: Route = {
  pathPrefix("registrations") {
    pathEnd {
      post {
        entity(as[Registration]) { registration =>

以下是build.sbt中的内容

代码语言:javascript
复制
scalaVersion := "2.10.4"

scalacOptions ++= Seq("-feature")

val akkaVersion = "2.3.8"

val sprayVersion = "1.3.1"

resolvers += "spray" at "http://repo.spray.io/"
resolvers += "Sonatype releases" at "https://oss.sonatype.org/content/repositories/releases"

// Main dependencies
libraryDependencies ++= Seq(
    "com.typesafe.akka" %% "akka-actor" % akkaVersion,
    "com.typesafe.akka" %% "akka-slf4j" % akkaVersion,
    "com.typesafe.akka" %% "akka-camel" % akkaVersion,
    "io.spray" % "spray-can" % sprayVersion,
    "io.spray" % "spray-routing" % sprayVersion,
    "io.spray" % "spray-client" % sprayVersion,
    "io.spray" %% "spray-json" % sprayVersion,
    "com.typesafe" % "config" % "1.2.1",
    "org.apache.activemq" % "activemq-camel" % "5.8.0",
    "ch.qos.logback" % "logback-classic" % "1.1.2",
    "org.mongodb" %% "casbah" % "2.7.4"
)

错误:

代码语言:javascript
复制
12:33:03.477 [admcore-microservice-system-akka.actor.default-dispatcher-3] DEBUG s.can.server.HttpServerConnection - Dispatching POST request to http://localhost:8878/api/v1/adsregistrations to handler Actor[akka://admcore-microservice-system/system/IO-TCP/selectors/$a/1#-1156351415]
Uncaught error from thread [admcore-microservice-system-akka.actor.default-dispatcher-3] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[admcore-microservice-system]
java.lang.NoSuchMethodError: spray.json.JsonParser$.apply(Ljava/lang/String;)Lspray/json/JsValue;
    at spray.httpx.SprayJsonSupport$$anonfun$sprayJsonUnmarshaller$1.applyOrElse(SprayJsonSupport.scala:36)
    at spray.httpx.SprayJsonSupport$$anonfun$sprayJsonUnmarshaller$1.applyOrElse(SprayJsonSupport.scala:34)
EN

回答 1

Stack Overflow用户

发布于 2015-03-17 23:03:17

为了避免任何问题,我将按照以下方式定义Register (它似乎是一个数据模型)

代码语言:javascript
复制
case class Register(system: String, identity: String, id: String)

这是因为让id字段作为字符串而不是BSON ObjectId (我习惯于不依赖于第三方库的数据模型)对我来说更有意义。

因此,正确的SprayJson协议将使用jsonFormat3而不是jsonFormat2

代码语言:javascript
复制
object RegistrationProtocol extends DefaultJsonProtocol {
  implicit val registrationFormat = jsonFormat3(Registration)
}

这将解决任何类型的JSON序列化问题。

最后,您的toBsonfromBson转换器将是:

代码语言:javascript
复制
def toBson(r: Registration): DBObject = {
    MongoDBObject(
      "system"    -> r.system,
      "identity"  -> r.identity,
      "_id"       -> new ObjectId(r.id)
    )
  }

代码语言:javascript
复制
def fromBson(o: DBObject): Registration = {
    Registration(
      system = o.as[String]("system"),
      identity = o.as[String]("identity"),
      id = o.as[ObjectId]("_id").toString
    )
  }

A这就是使用BSON ObjectId的地方:它更接近于MongoDB依赖逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27841565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档