私はScalaを初めて使用し、最初のPlay2.0アプリケーションを実行しようとしています。私が使用しているもの:
- Scala 2.9.3
- 2.0.4を再生する
- SalatWithPlay2 1.1
私の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インスタンスに自動的に変換することはできません。
ありがとう!