Creación de un contenedor para MongoDB POJO utilizando los genéricos

Griffin Meyer:

ACTUALIZACIÓN 2: creo que he hecho algunos progresos. Mi IDE es mucho más feliz de mi código, pero acabo de tener una línea final que es molesto:

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);

He cambiado el nombre de mi 'Colección' a 'Persona' para evitar temporalmente colllisisons con Java 'Collection'. Todo parece bien, excepto la última línea, lo que me da este error: insertOne (capture<? extends Utils.Person>) in MongoCollection cannot be applied to (Utils.Person). El 'esto' se está refiriendo a mi clase de persona. ¿Qué estoy haciendo mal aquí?

ACTUALIZACIÓN: Pregunta original a continuación. Creo que he determinado ahora que los genéricos son mi mejor apuesta. Sin embargo estoy teniendo algunos problemas 'generifying' estas dos líneas (suponiendo que he inicializado correctamente la base de datos):

MongoCollection<MyClass> collection = database.getCollection("SomeString", MyClass.class);

¿Cuál es la mejor manera de hacer esto? Java no parece que les gusta usar .class en un genérico.

Pregunta original:

Por eso quiero aprovechar la capacidad de los conductores MongoDB a PJOS tienda. Ejemplo Aquí . Pero planeo tener varias clases almacenados en la base de datos, y no quieren tener que volver a escribir todo el código de conexión cada vez, ni quiero copiar y pegar y modificar minorly el código para cada clase. Yo tenía la idea de hacer una clase de "Colección" y, a continuación, extender eso, pero no es del todo de trabajo de qué manera pensaba. Aquí está mi código:

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);
    }

}

Como se puede ver, quiero ser capaz de pasar en el nombre de la base de cualquier clase que hereda de esta clase (o lo que sea lo que hay que hacer es.), Y tengo mi código de conectarse a la base de datos y encontrar o guardar un POJO de la respectiva sub-clase correctamente. Así, por ejemplo, si tuviera una clase Persona con un número de teléfono, tan sólo pudiera extender mi clase Colecciones y contar con todo lo necesario para el trabajo. En este momento, cuando llamo a la función de ahorro en una clase hija, se trata de salvar el padre colección, y me da un errorCan't find a codec for class Utils.MongoDb.Collection.(Clase Mi colección está en mi propio espacio de nombres Utils.MongoDb). Solo estoy perdiendo algo? ¿Hay una mejor manera de hacer esto? La única manera que puedo pensar para conseguir que esto funcione es copia y pega el código en mi colección constructor en cada clase, y modificarlo con las variables de clase derecha. Espero que todo esto es clara. ¡Gracias por adelantado!

Griffin Meyer:

Aha! ¡Lo tengo! Lo que tenía que hacer era generify y escribir un método de ayuda para que pueda pasar en 'esto' como un objeto. También tuve que hacer una conversión a T. genérica Sé que es un reparto sin control, pero no estoy muy seguro de cómo me gustaría hacer lo revisen aquí. De cualquier manera, funciona!

 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;
    }

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=217873&siteId=1
Recomendado
Clasificación