アップデート2:私は、私はいくつかの進歩を遂げたと思います。私のIDEは、私のコードについてはあまり幸せであるが、私はただ怒っている最後の1行があります。
CodecRegistry pojoCodecRegistry = fromRegistries(MongoClient.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build()));
MongoClientURI connectionString = new MongoClientURI("my-mongo-string");
MongoClient mongoClient = new MongoClient(connectionString);
MongoDatabase database = mongoClient.getDatabase("New");
database = database.withCodecRegistry(pojoCodecRegistry);
MongoCollection<? extends Person> collection = database.getCollection("people", this.getClass());
collection = collection.withCodecRegistry(pojoCodecRegistry);
collection.insertOne(this);
私は一時的に、Javaの「コレクション」でcolllisisonsを防ぐために、「人」への上で、私の「コレクション」の名前を入れ替えました。すべてが私にこのエラーを与えている最後の行を除いて良いようです:insertOne (capture<? extends Utils.Person>) in MongoCollection cannot be applied to (Utils.Person)
。「これは私人のクラスを参照しています。何が私がここに間違っているのでしょうか?
UPDATE:以下の元の質問。私は今、ジェネリックが私の最善の策であると判断していると信じています。私はいくつかの問題「generifying」は、これらの2つの行を持っていますが(私が正しく、データベースを初期化してきたと仮定した場合):
MongoCollection<MyClass> collection = database.getCollection("SomeString", MyClass.class);
これを行うための最善の方法は何ですか?Javaは、一般的な上の.classを使っているようには思えません。
元の質問:
だから私は、ストアPJOSにMongoDBのドライバの機能を利用したいと思います。ここでは例。しかし、私は、データベースに格納された複数のクラスを持つことを計画し、私は、接続コードのすべてを毎回再入力する必要がありますする必要はありません、また私はコピー&ペーストして、minorly各クラスのコードを変更したいです。私は、「コレクション」クラスを作成し、そのを拡張するためのアイデアを持っていたが、非常に私が意図したどのように働いていません。ここに私のコードは次のとおりです。
public class Collection {
private MongoCollection<Collection> collection;
public Collection(){}
public Collection(String databaseName){
databaseName = databaseName.toLowerCase().replaceAll(" ", "");
CodecRegistry pojoCodecRegistry = fromRegistries(com.mongodb.MongoClient.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build()));
MongoClientURI connectionString = new MongoClientURI("my-mongo-connection-string");
com.mongodb.MongoClient mongoClient = new com.mongodb.MongoClient(connectionString);
MongoDatabase database = mongoClient.getDatabase(databaseName);
database = database.withCodecRegistry(pojoCodecRegistry);
collection = database.getCollection(this.getClass().getName(), Collection.class);
}
public Collection findOne(Document document){
return collection.find(document).first();
}
public void save(){
collection.insertOne(this);
}
}
あなたが見ることができるように、私はこのクラスから継承する任意のクラスにデータベース名を渡すことができるようにしたい(またはものは何でもする権利のことです。)、および私のコードのデータベースに接続し、検索したり、保存POJOを持っています各サブクラスの適切。だから私は電話番号にPersonクラスを持っていた場合など、私はちょうど私のコレクションクラスを拡張することができ、作業に至るまでにカウントされます。私は子クラスのセーブ機能を呼び出したときに今のところ、それは親のコレクションを保存しようと、私はエラーを取得しますCan't find a codec for class Utils.MongoDb.Collection.
(マイコレクションクラスは、私自身のUtils.MongoDb名前空間にあります)。私は何かが足りないのですか?これについて移動する良い方法はありますか?私は仕事にこれを取得するために考えることができる唯一の方法は、コピーされ、各クラスへの私のコレクションのコンストラクタにコードを貼り付け、右のクラス変数とそれを修正します。私はこのすべてが明らかであると思います。前もって感謝します!
なるほど!私はそれを持っている!私は何をしなければならなかったことはgenerifyだったと私はオブジェクトとして「は、この」に渡すことができるようにヘルパーメソッドを記述します。また、私はそれが未チェックのキャストだけど、私はかなり確実私はそれをここでチェック作ると思いますかないんだけど、一般的なT.へのキャストをしなければなりませんでした。いずれにせよ、それは働きます!
public <T> void saveObj(T obj){
String dbName = "New";
MongoDatabase database = getMongoDatabase(dbName);
MongoCollection<T> collection = (MongoCollection<T>) database.getCollection(obj.getClass().getSimpleName(), obj.getClass());
collection.insertOne(obj);
}
public MongoDatabase getMongoDatabase(String dbName) {
CodecRegistry pojoCodecRegistry = fromRegistries(MongoClient.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build()));
MongoClientURI connectionString = new MongoClientURI("my-mongo-string");
MongoClient mongoClient = new MongoClient(connectionString);
MongoDatabase database = mongoClient.getDatabase(dbName);
database = database.withCodecRegistry(pojoCodecRegistry);
return database;
}