1

私はScalaを初めて使用し、最初のPlay2.0アプリケーションを実行しようとしています。私が使用しているもの:

私のconf/routesファイルにはこれがあります:

PUT /newVenue   controllers.Application.createNewVenue

私のApplication.scalaファイルにはこれがあります:

def createNewVenue = Action(parse.json) { request =>
    val newVenue = Venue.fromJSON(request.body.toString)
    Venue.insert(newVenue)
    Ok("New Venue Created")
  }

そしてこれはのためのコードですVenue.scala

import play.api.Play.current
import com.novus.salat._
import com.novus.salat.global._
import com.novus.salat.annotations._
import com.novus.salat.dao._
import com.mongodb.casbah.Imports._
import se.radley.plugin.salat._

object Venue extends ModelCompanion[Venue, ObjectId] {
        val collection = mongoCollection("venues")
        val dao = new SalatDAO[Venue, ObjectId](collection = collection) {}
    }

case class Venue(
        @Key("_id") val venueId:ObjectId,
        var playlist:Playlist, 
        var isPlaying:Boolean = false)

localhost:9000/newVenueこれが機能しているかどうかをテストするために、このJSONを本文としてPUTリクエストをに送信します。

{"venueId": 3,"playlist":{"playlistId":2,"currentSongPosition":5},"isPlaying":false}

そして、私はこのエラーを受け取ります:

[error] application - 

! @6d7oco1hf - Internal server error, for request [PUT /newVenue] ->

play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[NoSuchMethodException: model.Venue$.apply$default$1()]]
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:134) [play_2.9.1.jar:2.0.4]
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115) [play_2.9.1.jar:2.0.4]
    at akka.actor.Actor$class.apply(Actor.scala:318) [akka-actor.jar:2.0.2]
    at play.core.ActionInvoker.apply(Invoker.scala:113) [play_2.9.1.jar:2.0.4]
    at akka.actor.ActorCell.invoke(ActorCell.scala:626) [akka-actor.jar:2.0.2]
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197) [akka-actor.jar:2.0.2]
Caused by: java.lang.NoSuchMethodException: model.Venue$.apply$default$1()
    at java.lang.Class.getMethod(Class.java:1605) ~[na:1.6.0_37]
    at com.novus.salat.ConcreteGrater.defaultArg(Grater.scala:350) ~[salat-core_2.9.1-1.9.1.jar:1.9.1]
    at com.novus.salat.ConcreteGrater.safeDefault(Grater.scala:360) ~[salat-core_2.9.1-1.9.1.jar:1.9.1]
    at com.novus.salat.ConcreteGrater$$anonfun$6$$anonfun$apply$7.apply(Grater.scala:319) ~[salat-core_2.9.1-1.9.1.jar:1.9.1]
    at com.novus.salat.ConcreteGrater$$anonfun$6$$anonfun$apply$7.apply(Grater.scala:319) ~[salat-core_2.9.1-1.9.1.jar:1.9.1]
    at scala.Option.orElse(Option.scala:218) ~[scala-library.jar:0.11.3]

エラーをトリガーする行はvalnewVenue= Venue.fromJSON(request.body.toString)だと思います。

誰かが何が悪いのか手がかりを持っていますか?私はSalatWithPlay2ページのチュートリアルに従い、同様の問題についてもいくつかのアドバイスに従いました)が、これまでのところ運がありませんでした。

更新

正確には解決策ではありませんが、回避策を見つけましたが、他の誰かや実際の解決策を理解するのに役立つかもしれません。

アノテーション@Keyを削除すると、ケースクラスVenueのコードは次のようになります。

case class Venue(
        val venueId:ObjectId,
        var playlist:Playlist, 
        var isPlaying:Boolean = false)

そして、私はこの他のエラーを受け取ります:

[RuntimeException: in: unexpected OID input class='net.liftweb.json.JsonAST$JInt', value='3']

たとえば、ObjectIdを使用する代わりにLongを使用する場合、コードは次のようになります。

case class Venue(
        val venueId:Long,
        var playlist:Playlist, 
        var isPlaying:Boolean = false) 

そして、私はエラーを受け取りません!

したがって、NoSuchMethodExceptionは、明らかに_idに関連する@Keyアノテーションに関連しています。また、venueIdの名前を_idに変更しようとしましたが、同じNoSuchMethodExceptionエラーが発生しました。したがって、問題は、@ Keyアノテーションを使用して、どの属性がmongoデータベース内のドキュメントのオブジェクトIDにマップされているかを示すことができないのはなぜですか? それ以外に、他の理由で通常の整数をObjectIdインスタンスに自動的に変換することはできません。

ありがとう!

4

2 に答える 2

0

暗闇の中でのショットですが、オブジェクトクラスに別の名前を付けてみてください。多分VenueCompanionに?コンパイラがどのオブジェクトに適用するかについて混乱している可能性があるようです。IEは、必要なケースクラスVenueには適用されません。例外がその後も同じであるかどうか私は興味があります。

于 2013-02-02T19:20:56.247 に答える
0

だから私は何が問題なのかを見つけました。

リクエストの本文で送信されるJsonの属性は、Scalaオブジェクトの属性ではなく、mongodbのドキュメントの属性の名前と一致する必要があります。

したがって、私のクラスVenueが次のように定義されている場合:case class Venue(@Key( "_ id")valvenueId:ObjectId、varplaylist:Playlist、var isPlaying:Boolean = false)

PUTリクエストで送信する必要があるJsonは次のとおりです。

{"_id": 3,"playlist":{"playlistId":2,"currentSongPosition":5},"isPlaying":false}

そしてではありません

{"venueId": 3,"playlist":{"playlistId":2,"currentSongPosition":5},"isPlaying":false}
于 2013-02-03T03:03:25.813 に答える