4

こんにちは私はJavaでPlayFramework2を学んでいて、問題があります。私はMongoDBを使用しており、ObjectIdを一意のIDとして持つ単純なクラスUserを持っています。

public class User {


    @JsonProperty
    public ObjectId id;

..

私の見解では、現在のユーザーを削除するためのボタンを追加したいと思います。

 @form(routes.Application.deleteUser(user.id)) {
       <input type="submit" value="Delete">
 }

そして私のルートファイルで:

POST    /users/:id/delete               controllers.Application.deleteUser(id: org.bson.types.ObjectId)

しかし今、私はエラーが発生しました:

「タイプorg.bson.types.ObjectIdのURLパスバインダーが見つかりません。このタイプの暗黙的なPathBindableを実装してみてください。」

多くのことを試しました。たとえば、ObjectId値のみを文字列として渡そうとしましたが、何も機能しませんでした。誰かがこれで私を助けてくれますか?

4

3 に答える 3

4

必要なバインダーが含まれているplay-salatを使用して、依存関係として追加しproject/Build.scala、ルートとテンプレートにインポートすることができます。

import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

  val appDependencies = Seq(
    "se.radley" %% "play-plugins-salat" % "1.2-SNAPSHOT"
  )

  val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
    resolvers       += "OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/",
    routesImport    += "se.radley.plugin.salat.Binders._",
    templatesImport += "org.bson.types.ObjectId"
  )
}

このサンプルアプリケーションもご覧ください。

于 2012-12-29T07:38:17.050 に答える
0

結局、Java 用の MongoDB ORM であるMorphiaを探しているのでしょうか? Morphiaの場合、Slideshare のこのチュートリアルが良いキックスタートになるかもしれません。

_idところで、ユーザー名の文字列については、Mongo の ObjectId よりも優れていることがわかりました。

小さな例:

//Routes
GET     /add/:username     controllers.Application.createTestPerson(username)
GET    /delete/:username   controllers.Application.delete(username)

//Controller
public class Application extends Controller {
  ...
  public static Result createTestPerson(String username){
      //DB connection and Morphia Datastore
      DBConn conn = new DBConn("test");
      Datastore ds = conn.getDatastore();
      //Person document for saving
      Person person = new Person(username);
      person.setName("John", "Doe");
      //save person to Mongo
      ds.save(person);  
      return ok("user \""+username+"\" saved");
  }

  public static Result delete(String username){
      //DB connection and Morphia Datastore
      DBConn conn = new DBConn("test");
      Datastore ds = conn.getDatastore();
      ds.delete(Person.class,username);
      return ok("user \""+username+"\" deleted");
  }
}

//models Person.java
import com.google.code.morphia.annotations.*;
import org.bson.types.ObjectId;

@Entity("persons")
public class Person {

    @Id
    String userName;
    Name name;

    public Person(String u){ userName = u; }

    public void setName(String first, String last){
        name = new Name(first, last);
    }
}
@Embedded
class Name {
    String first, last;

    public Name(){ }
    public Name(String first, String last) {
        this.first = first;
        this.last = last;
    }
}


//models DBConn.java
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Morphia;
import com.mongodb.Mongo;
import java.net.UnknownHostException;

public class DBConn implements AutoCloseable{
    Morphia morphia;
    Mongo mongo;
    Datastore ds;

    public DBConn(){
        new DBConn("test");
    }
    public DBConn(String collection){
        morphia = new Morphia();
        try {
            mongo = new Mongo();
        } catch (UnknownHostException ex) {
            System.out.println("[Error] MongoDB Error");
        }
        ds = morphia.createDatastore(mongo, collection);
        System.out.println("DB conn success ["+ ds.getDB().getName() + "]");
    }
    public Datastore getDatastore(){
        return ds;
    }
    public void close() throws Exception {
        mongo.close();
    }
}

だから

localhost:9000/delete/what-ever-here

localhost:9000/createTestPerson/what-ever-here

Mongo コレクションを管理し、Mongo コンソールで結果を確認できるはずです。

> db.persons.find()
{ "_id" : "johndoe", "className" : "models.Person", "name" : { "first" : "John",
 "last" : "Doe" } }
>
于 2012-12-30T04:26:09.693 に答える