当前位置: 首页 > 知识库问答 >
问题:

使用Scala和Jackson Mapper反序列化MongoDB文档会导致无法识别的属性id

蒋嘉实
2023-03-14

我在Scala中使用Jackson作为映射器定义了以下类。

package models

import play.api.Play.current
import org.codehaus.jackson.annotate.JsonProperty
import net.vz.mongodb.jackson.ObjectId
import play.modules.mongodb.jackson.MongoDB
import reflect.BeanProperty
import scala.collection.JavaConversions._
import net.vz.mongodb.jackson.Id
import org.codehaus.jackson.annotate.JsonIgnoreProperties

case class Team( 
  @BeanProperty @JsonProperty("teamName") var teamName: String,
  @BeanProperty @JsonProperty("logo") var logo: String,
  @BeanProperty @JsonProperty("location") var location: String,
  @BeanProperty @JsonProperty("details") var details: String,
  @BeanProperty @JsonProperty("formOfSport") var formOfSport: String) 

object Team {
  private lazy val db = MongoDB.collection("teams", classOf[Team], classOf[String])

  def save(team: Team) { db.save(team) }


  def getAll(): Iterable[Team] = {
    val teams: Iterable[Team] = db.find()    
    return teams
  }

  def findOneByTeamName(teamName: String): Team = {
    val team: Team = db.find().is("teamName", teamName).first
    return team
  }

}

插入mongoDB工作没有问题,一个_id会自动为每个文档插入。

但现在我想尝试读取(或反序列化)文档,例如通过调用findOneByTeamName。这总是会导致_id出现无法识别的属性异常我使用团队创建实例。应用团队。取消应用。即使有自己的ObjectId,这也不起作用,因为\u idid被视为不同的对象。

有人能帮助我们如何获取实例或如何正确地反序列化吗?提前谢谢

共有1个答案

欧照
2023-03-14

我正在使用play-mongoJack。这是我的类。你的对象定义很好。

import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.ObjectMapper
import org.mongojack.{MongoCollection, JacksonDBCollection}
import org.mongojack.ObjectId
import org.mongojack.WriteResult
import com.mongodb.BasicDBObject

import scala.reflect.BeanProperty
import javax.persistence.Id
import javax.persistence.Transient
import java.util.Date
import java.util.List
import java.lang.{ Long => JLong }
import play.mongojack.MongoDBModule
import play.mongojack.MongoDBPlugin
import scala.collection.JavaConversions._
class Event (
  @BeanProperty @JsonProperty("clientMessageId") val clientMessageId: Option[String] = None,
  @BeanProperty @JsonProperty("conversationId") val conversationId: String
  ) {
  @ObjectId @Id @BeanProperty var messageId: String = _ // don't manual set messageId
  @BeanProperty @JsonProperty("uploadedFile") var uploadedFile: Option[(String, String, JLong)] =  None // the upload file(url,name,size)
  @BeanProperty @JsonProperty("createdDate") var createdDate: Date = new Date()
  @BeanProperty @Transient var cmd: Option[(String, String)] =  None // the cmd(cmd,param)

  def createdDateStr() = {
    val format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    format.format(createdDate)
  }
}
 类似资料:
  • 问题内容: 我已经在SO中阅读了一些关于答案的问题,这些问题与JSON属性之间的序列化和反序列化有关,但我似乎无法使其正常工作。 我已经设法将Spring Boot应用程序配置为以所需的格式()返回日期,但在以JSON格式接收值时遇到问题。 这些是我到目前为止所做的所有事情: 增加了对Maven的依赖: 在我的主要课程中指定: 禁用序列化作为时间戳记: 这是我的日期时间实体映射: 在我的数据库中,

  • 我已经将Spring Boot应用程序配置为以我希望的格式()返回日期,但是在JSON中接受这种格式的值有问题。 这些都是我到目前为止所做的事情: 为添加了maven依赖项: 在我的数据库中,我以以下格式将此日期存储为时间戳:。 如果我通过我的控制器访问这个实体,它将返回具有正确startDate格式的JSON。但是,当我尝试使用格式发布并反序列化它时,我会遇到以下异常: 我知道有很多关于这个话题

  • 我有一个问题,将时间值反序列化为本地时间-授予,我对Nodatime很陌生。我想导入一个web服务结果,它以“hh:mm”格式列出了一个时间。除非使用“hh:mm:ss.fff”格式的时间,否则会出现异常。是否有一种方法可以指定一个不同的模式并让“hh:mm”工作? 请看此代码 引发异常:

  • 我们正在使用Drools 7.5.0和Java8。 我们有一个处理传感器事件的服务器应用程序,大约有1200个会话。每个会话都是一个参数化的知识。当我们重新启动服务器时,我们必须恢复所有没有我们希望看到的那么快的会话。因此,尝试通过从数据库加载序列化的知识库来优化恢复过程。 我们使用以下代码来序列化和反序列化知识库: 事件是不可变的,并且具有最终字段。恢复会话时,会出现以下异常: 它被抛出到这行代