无法访问Seq元素并将整个Seq作为Json返回

时间:2017-04-07 09:09:53

标签: json scala

所以我对Scala非常陌生,似乎在为一个简单的逻辑做一些可怕的错误。 我需要查询数据库以获取所有的WebsiteTemplates。 然后我试图访问序列的第一个元素(仅用于练习),但继续得到 ClassCastException - [Ljava.lang.Object;无法转换为models.WebsiteTemplate 。接下来,我想要返回作为Json获得的整个Seq。试过Json.arr()但不行。搜索但没有一个奇怪地匹配确切的用例。这与代码相关 -

WebsiteController

@Singleton
class WebsiteTemplateController @Inject()(websiteTemplateDAO: WebsiteTemplateDAO, db: DB) extends Controller{

  def index = Action.async {
    implicit request => db.withTransaction() {
      implicit em => {
        try {

          val templates: Seq[WebsiteTemplate] = websiteTemplateDAO.findAll()
          val template = templates(0)

          Logger.info("The size is " + template.name)
          Future(Ok(Json.obj(
            "message" -> "Success"
          )))
        } catch {

          case e: Exception =>
            e.printStackTrace()
            Future(InternalServerError(s"Lag gaye"))
        }
      }
    }
  }
}

WebsiteDAOImpl

@ImplementedBy(classOf[WebsiteTemplateDAOImpl])
trait WebsiteTemplateDAO extends DAO[WebsiteTemplate]{
  def findAll()(implicit em: EntityManager): Seq[WebsiteTemplate]
}

@Singleton
class WebsiteTemplateDAOImpl @Inject()(db: DB) extends DAOImpl(classOf[WebsiteTemplate]) with WebsiteTemplateDAO{

  override def findAll()(implicit em: EntityManager): Seq[WebsiteTemplate] = {

    val query = em.createQuery(s"SELECT idint, name FROM WebsiteTemplate")
    db.executeQuery(query)
  }
}

DAOImpl

trait DAO[T] {
  def findById(id:String)(implicit em:EntityManager) : Option[T]
  def create : T
}

class DAOImpl[T](cls:Class[T]) extends DAO[T] {
  def findById(id: String)(implicit em: EntityManager): Option[T] = {
    val query = em.createQuery(s"Select c from ${cls.getName} as c where c.id=:id")
    query.setParameter("id",id)
    val list = query.getResultList
    if (list.nonEmpty) {
      Option(list(0).asInstanceOf[T])
    } else {
      None
    }
  }

  override def create: T = {
    cls.newInstance()
  }
}

WebsiteTemplate

@Entity
@Table(name = "templates")
@EntityListeners(Array(classOf[SetForeignKeyOnSave]))
class WebsiteTemplate{

  @Id
  @Column(name = "id")
  @BeanProperty
  var intid: java.lang.Integer = _

  /*@Transient
  override var id: String = _*/

  @BeanProperty
  @Column(name = "name")
  var name: String = _
}

对我的问题进行更多解释。在使用getClass()方法获取模板类型(0)时,它显示为[Ljava.lang.Object,而我希望它是WebsiteTemplate类型。

0 个答案:

没有答案