4

データストアとしてMongoDBを使用するJavaPlay2.1-RC2アプリケーションに取り組んでいます。私はMongoDBを操作するためにJongoモジュールを使用しています。この種のエラーが発生するまで、すべてが順調に進んでいました。

java.lang.NoSuchFieldError:ホーム

これらのエラーは私のテンプレートに起因し、逆ルーティングを使用することによって発生します。この特定のケースでは、ホームコントローラーに到達しようとしています。

逆のルートは次のようになります:@ routers.Home.edit(document.url)

ルート自体は次のようになります。GET/homepage/:url / edit controllers.Home.edit(url)

これは以前は機能していましたが、MongoDBの実装に取り​​組み始めてから、これらのエラーが発生し始めました。ふたりのつながりがわからない。ルーティングに干渉しているとは思いません。このプロジェクトは2.0.4プロジェクトとして始まりました。これまで、2.1-RC1への移行は順調に進み、2.1-RC2も同様に機能するようでした。Mongoモデルを操作するための独自のModelコンビニエンスクラスを作成しました。この動作を引き起こしている何かがそこにありますか?

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "_class")
public class Model {

  @JsonProperty("_id")
  public ObjectId id;

  public MongoCollection models() {
    String collectionName = this.getClass().getName() + "s";
    return PlayJongo.getCollection(collectionName);
  }

  public void save() {
    models().save(this);
  }

  public void update() {
    this.remove();
    this.save();
  }

  public void remove() {
    models().remove(this.id);
  }

  public static class Finder<T> {

    private final Class<T> type;

    public Finder(Class<T> type) {
      this.type = type;
    }

    public MongoCollection models() {
      String collectionName = type.getName() + "s";
      return PlayJongo.getCollection(collectionName);
    }

    public List<T> all() {

      List<T> list = new ArrayList<>();
      Iterator<T> it = models().find().as(type).iterator();
      while (it.hasNext()) {
        list.add(it.next());
      }
      return list;
    }

    public T byId(ObjectId id) {
      return models().findOne(id).as(type);
    }

    public T byUrl(String url) {
      return models().findOne("{url: #}", url).as(type);
    }

    public List<T> byQuery(String query) {
      List<T> list = new ArrayList<>();
      Iterator<T> it = models().find(query).as(type).iterator();
      while (it.hasNext()) {
        list.add(it.next());
      }
      return list;
    }
  }

私のplugins.sbt:

// Comment to get more information during initialization
logLevel := Level.Warn

// The Typesafe repository
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

// Use the Play sbt plugin for Play projects
addSbtPlugin("play" % "sbt-plugin" % "2.1-RC2")

私のbuild.properties:

sbt.version=0.12.2-RC2

私のBuild.scala:

import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

  val appName = "Test"
  val appVersion = "0.1-SNAPSHOT"

  val appDependencies = Seq(
    javaCore,
    "uk.co.panaxiom" %% "play-jongo" % "0.3"
  )

  val main = play.Project(appName, appVersion, appDependencies).settings(
    lessEntryPoints <<= (sourceDirectory in Compile)(base => (
      (base / "assets" / "css" / "bootstrap.less") +++
        (base / "assets" / "css" / "responsive.less")
      )
    )
  )
}

関連する可能性のある唯一のapplication.conf行:

playjongo.uri="mongodb://127.0.0.1:27017/test"
playjongo.gridfs.enabled=false

ehcacheplugin=enabled

そしてスタックトレース:

! @6d48738mo - Internal server error, for (GET) [/] ->

play.api.Application$$anon$1: Execution exception[[RuntimeException: java.lang.NoSuchFieldError: Home]]
    at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1-RC2]
    at play.api.DefaultApplication.handleError(Application.scala:383) [play_2.10.jar:2.1-RC2]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:114) [play_2.10.jar:2.1-RC2]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:110) [play_2.10.jar:2.1-RC2]
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1-RC2]
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1-RC2]
java.lang.RuntimeException: java.lang.NoSuchFieldError: Home
    at play.libs.F$Promise$6.apply(F.java:377) ~[play_2.10.jar:2.1-RC2]
    at scala.concurrent.Future$$anonfun$map$1.liftedTree2$1(Future.scala:253) ~[scala-library.jar:na]
    at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:249) ~[scala-library.jar:na]
    at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:249) ~[scala-library.jar:na]
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:29) ~[scala-library.jar:na]
    at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.liftedTree1$1(BatchingExecutor.scala:67) ~[akka-actor_2.10.jar:na]
Caused by: java.lang.NoSuchFieldError: Home
    at views.html.documents.homepage$.apply(homepage.template.scala:45) ~[na:na]
    at views.html.documents.homepage$.render(homepage.template.scala:51) ~[na:na]
    at views.html.documents.homepage.render(homepage.template.scala) ~[na:na]
    at controllers.Home.read(Home.java:24) ~[na:na]
    at controllers.Application.index(Application.java:24) ~[na:na]
    at Routes$$anonfun$routes$1$$anonfun$applyOrElse$17$$anonfun$apply$17.apply(routes_routing.scala:251) ~[na:na]

誰かがこれらのエラーがどこから来ているのか教えてくれるか、正しい方向に私を向けることができれば、私は非常に感謝しています!さらに詳しい情報が必要な場合はお知らせください。

4

3 に答える 3

2

わかりました、Play 2.1.0 でまったく同じエラーが発生し、2 晩かけてようやく問題の場所を見つけたようです!

私が使用していたモジュールには、controllers.Application という名前のコントローラーがあり、そのルートがモジュールの conf/routes ファイルに入力されており、プロジェクトにまったく同じコントローラーがあります (ルートも含まれています)。それが私にとっての問題の原因だったようです。

したがって、競合するコントローラーまたはルートについてモジュール (またはサブプロジェクト?) を調べれば、問題が解決するはずです。

于 2013-02-11T22:01:17.110 に答える
0

ルートにパラメータタイプを追加する必要があります。したがって、次のようになります。

 GET /homepage/:url/edit controllers.Home.edit(url: String)

Playのドキュメントには、これを行わない例がいくつかあります。ただし、explisitタイプを宣言することがベストプラクティスだと思います。

于 2013-01-28T06:17:43.557 に答える
0

https://github.com/hongsw/play2-ジョンゴモデル

JongoModelのサンプルプロジェクトを作りました

(Play! フレームワーク 2.1)

于 2013-02-18T17:30:35.233 に答える