Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用mongo driver for java保存接口对象列表_Java_Mongodb - Fatal编程技术网

使用mongo driver for java保存接口对象列表

使用mongo driver for java保存接口对象列表,java,mongodb,Java,Mongodb,我有一个POJO,它有一个Resources列表,它是ResourceType1和ResourceType2 public class MyPojo { private List<Resource>; .... } public interface Resource { public String getResourceId(); } public ResourceType1 implements Resource{ public String getResource

我有一个POJO,它有一个
Resource
s列表,它是
ResourceType1
ResourceType2

public class MyPojo {
 private List<Resource>;
 ....
}

public interface Resource {
  public String getResourceId();
}

public ResourceType1 implements Resource{
  public String getResourceId(){ return resourceType1Id; }
  public String doOtherResourceType1SpecificStuff(){}
}

public ResourceType2 implements Resource{
  public String getResourceId(){ return resourceType2Id; }
  public boolean doOtherResourceType2SpecificStuff(){}
}

public class Database {
  CodecRegistry pojoCodecRegistry = fromRegistries(
            MongoClient.getDefaultCodecRegistry(),
            fromProviders(PojoCodecProvider.builder()
            .register(MyPojo.class)
            .register(ResourceType1.class)
            .register(ResourceType2.class)
            .register(Resource.class)
            .automatic(true).build()));
}
我过去也遇到过类似的问题,我刚刚编写了一个
MyPojoWrapper
,在那里我手动封送和取消封送了所有内容。然而我不得不相信这是更常见的,有一个简单的解决办法,我没有看到。提前感谢。

公共类MongoInterfaceTest{
public class MongoInterfaceTest {

    private static MongoClient mongoClient;

    static {
        init();
    }

    public static void init() {
        try {
            ClassModel<User> userClassModel = ClassModel.builder(User.class).enableDiscriminator(true).build();
            ClassModel<JavaUser> javaUserClassModel = ClassModel.builder(JavaUser.class).enableDiscriminator(true).build();
            ClassModel<PythonUser> pythonUserClassModel = ClassModel.builder(PythonUser.class).enableDiscriminator(true).build();
            ClassModel<TestUser> testUserClassModel = ClassModel.builder(TestUser.class).enableDiscriminator(true).build();

            CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(
                    MongoClientSettings.getDefaultCodecRegistry(),
                    CodecRegistries.fromProviders(
                            PojoCodecProvider.builder()
                                    .register(
                                            userClassModel,
                                            javaUserClassModel,
                                            pythonUserClassModel,
                                            testUserClassModel
                                    )
                                    .automatic(true)
                                    .build()
                    )
            );

            mongoClient = MongoClients.create(
                    MongoClientSettings.builder()
                            .codecRegistry(pojoCodecRegistry)
                            .applyConnectionString(new ConnectionString(ApplictaionConfig.MONGODB_URL))
                            .applyToConnectionPoolSettings(builder -> {
                                builder.minSize(10);
                            })
                            .build()
            );
        } catch (Exception e) {
            System.out.println("Connection mongodb failed");
            throw new RuntimeException();
        }
    }

    public static void main(String[] args) {
        MongoCollection<TestUser> collection = getMongoCollection("TestUser", TestUser.class);

        JavaUser javaUser = new JavaUser("a");
        PythonUser pythonUser = new PythonUser("b","1");

        TestUser testUser = new TestUser(javaUser.name, javaUser);
        insertOne(collection, testUser);

        testUser = new TestUser(pythonUser.name, pythonUser);
        insertOne(collection, testUser);

        Bson bson = Filters.and(Filters.eq("name", "a"));
        TestUser testUser1 = findFirst(collection, bson);
        System.out.println(testUser1);
        System.out.println(testUser1.user.dev());

        bson = Filters.and(Filters.eq("name", "b"));
        testUser1 = findFirst(collection, bson);
        System.out.println(testUser1);
        System.out.println(testUser1.user.dev());
    }

    /**
     * 获得collection对象
     */
    public static <T> MongoCollection<T> getMongoCollection(String collectionName, Class<T> tClass) {
        MongoDatabase mongoDatabase = mongoClient.getDatabase("kikuu");
        MongoCollection<T> collection = mongoDatabase.getCollection(collectionName, tClass);
        return collection;
    }

    public static <T> void insertOne(MongoCollection<T> collection, T document) {
        insertMany(collection, Lists.newArrayList(document));
    }

    public static <T> void insertMany(MongoCollection<T> collection, List<T> documents) {
        collection.insertMany(documents);
    }

    public static <T> T findFirst(MongoCollection<T> collection) {
        return (T) collection.find().first();
    }

    public static <T> T findFirst(MongoCollection<T> collection, Bson bson) {
        return (T) collection.find(bson).first();
    }

    public static interface User {
        String dev();
    }

    public static class JavaUser implements User{
        public String name;

        public JavaUser() {
        }

        public JavaUser(String name) {
            this.name = name;
        }

        @Override
        public String dev() {
            return "java";
        }

        @Override
        public String toString() {
            return "JavaUser{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }

    public static class PythonUser implements User{
        public String name;
        public String age;

        public PythonUser() {
        }

        public PythonUser(String name, String age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public String dev() {
            return "python";
        }

        @Override
        public String toString() {
            return "PythonUser{" +
                    "name='" + name + '\'' +
                    ", age='" + age + '\'' +
                    '}';
        }
    }

    public static class TestUser {
        public String name;
        public User user;

        public TestUser() {
        }

        public TestUser(String name, User user) {
            this.name = name;
            this.user = user;
        }

        @Override
        public String toString() {
            return "TestUser{" +
                    "name='" + name + '\'' +
                    ", user=" + user +
                    '}';
        }
    }
}
私有静态MongoClient MongoClient; 静止的{ init(); } 公共静态void init(){ 试一试{ ClassModel userClassModel=ClassModel.builder(User.class).enableDiscriminator(true.build(); ClassModel javaUserClassModel=ClassModel.builder(JavaUser.class).enableDiscriminator(true.build(); ClassModel pythonUserClassModel=ClassModel.builder(PythonUser.class).enableDiscriminator(true.build(); ClassModel testUserClassModel=ClassModel.builder(TestUser.class).enableDiscriminator(true.build(); CodeRegistry pojoCodecRegistry=CodeRegistries.fromRegistries( MongoClientSettings.getDefaultCodecRegistry(), CodecRegistries.fromProviders( PojoCodecProvider.builder() .登记( userClassModel, javaUserClassModel, pythonUserClassModel, testUserClassModel ) .自动(真) .build() ) ); mongoClient=MongoClients.create( MongoClientSettings.builder() .codecRegistry(pojoCodecRegistry) .applyConnectionString(新连接字符串(ApplictaionConfig.MONGODB_URL)) .applyToConnectionPoolSettings(生成器->{ 建造商:minSize(10); }) .build() ); }捕获(例外e){ System.out.println(“连接mongodb失败”); 抛出新的RuntimeException(); } } 公共静态void main(字符串[]args){ MongoCollection collection=getMongoCollection(“TestUser”,TestUser.class); JavaUser JavaUser=新的JavaUser(“a”); python用户python用户=新的python用户(“b”,“1”); TestUser TestUser=newtestuser(javaUser.name,javaUser); insertOne(收集、测试用户); testUser=newtestuser(pythonUser.name,pythonUser); insertOne(收集、测试用户); Bson-Bson=Filters.and(Filters.eq(“name”,“a”)); TestUser testUser1=findFirst(集合,bson); System.out.println(testUser1); System.out.println(testUser1.user.dev()); bson=Filters.and(Filters.eq(“name”,“b”)); testUser1=findFirst(集合,bson); System.out.println(testUser1); System.out.println(testUser1.user.dev()); } /** * 获得收集对象 */ 公共静态MongoCollection getMongoCollection(字符串集合名称,类tClass){ MongoDatabase MongoDatabase=mongoClient.getDatabase(“kiku”); MongoCollection collection=mongoDatabase.getCollection(collectionName,tClass); 回收; } 公共静态void insertOne(MongoCollection集合,T文档){ insertMany(collection,list.newArrayList(document)); } 公共静态void insertMany(MongoCollection集合、列表文档){ 收藏.插入许多(文件); } 公共静态T findFirst(MongoCollection集合){ return(T)collection.find().first(); } 公共静态T findFirst(MongoCollection集合,Bson Bson){ return(T)collection.find(bson.first(); } 公共静态接口用户{ 字符串dev(); } 公共静态类JavaUser实现用户{ 公共字符串名称; 公共JavaUser(){ } 公共JavaUser(字符串名称){ this.name=名称; } @凌驾 公共字符串dev(){ 返回“java”; } @凌驾 公共字符串toString(){ 返回“JavaUser{”+ “name=”+name+“\”+ '}'; } } 公共静态类PythonUser实现用户{ 公共字符串名称; 公共字符串年龄; 公共Python用户(){ } 公共Python用户(字符串名称、字符串年龄){ this.name=名称; 这个。年龄=年龄; } @凌驾 公共字符串dev(){ 返回“python”; } @凌驾 公共字符串toString(){ 返回“PythonUser{”+ “name=”+name+“\”+ “,年龄=”+age+“\”+ '}'; } } 公共静态类TestUser{ 公共字符串名称; 公共用户; 公共TestUser(){ } 公共TestUser(字符串名称、用户){ this.name=名称; this.user=用户; } @凌驾 公共字符串toString(){ 返回“TestUser{”+ “name=”+name+“\”+ “,user=“+user”+ '}'; } } }
这种方法不适合我。我仍然得到相同的找不到公共构造函数的接口错误。对我来说毫无意义。。
public class MongoInterfaceTest {

    private static MongoClient mongoClient;

    static {
        init();
    }

    public static void init() {
        try {
            ClassModel<User> userClassModel = ClassModel.builder(User.class).enableDiscriminator(true).build();
            ClassModel<JavaUser> javaUserClassModel = ClassModel.builder(JavaUser.class).enableDiscriminator(true).build();
            ClassModel<PythonUser> pythonUserClassModel = ClassModel.builder(PythonUser.class).enableDiscriminator(true).build();
            ClassModel<TestUser> testUserClassModel = ClassModel.builder(TestUser.class).enableDiscriminator(true).build();

            CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(
                    MongoClientSettings.getDefaultCodecRegistry(),
                    CodecRegistries.fromProviders(
                            PojoCodecProvider.builder()
                                    .register(
                                            userClassModel,
                                            javaUserClassModel,
                                            pythonUserClassModel,
                                            testUserClassModel
                                    )
                                    .automatic(true)
                                    .build()
                    )
            );

            mongoClient = MongoClients.create(
                    MongoClientSettings.builder()
                            .codecRegistry(pojoCodecRegistry)
                            .applyConnectionString(new ConnectionString(ApplictaionConfig.MONGODB_URL))
                            .applyToConnectionPoolSettings(builder -> {
                                builder.minSize(10);
                            })
                            .build()
            );
        } catch (Exception e) {
            System.out.println("Connection mongodb failed");
            throw new RuntimeException();
        }
    }

    public static void main(String[] args) {
        MongoCollection<TestUser> collection = getMongoCollection("TestUser", TestUser.class);

        JavaUser javaUser = new JavaUser("a");
        PythonUser pythonUser = new PythonUser("b","1");

        TestUser testUser = new TestUser(javaUser.name, javaUser);
        insertOne(collection, testUser);

        testUser = new TestUser(pythonUser.name, pythonUser);
        insertOne(collection, testUser);

        Bson bson = Filters.and(Filters.eq("name", "a"));
        TestUser testUser1 = findFirst(collection, bson);
        System.out.println(testUser1);
        System.out.println(testUser1.user.dev());

        bson = Filters.and(Filters.eq("name", "b"));
        testUser1 = findFirst(collection, bson);
        System.out.println(testUser1);
        System.out.println(testUser1.user.dev());
    }

    /**
     * 获得collection对象
     */
    public static <T> MongoCollection<T> getMongoCollection(String collectionName, Class<T> tClass) {
        MongoDatabase mongoDatabase = mongoClient.getDatabase("kikuu");
        MongoCollection<T> collection = mongoDatabase.getCollection(collectionName, tClass);
        return collection;
    }

    public static <T> void insertOne(MongoCollection<T> collection, T document) {
        insertMany(collection, Lists.newArrayList(document));
    }

    public static <T> void insertMany(MongoCollection<T> collection, List<T> documents) {
        collection.insertMany(documents);
    }

    public static <T> T findFirst(MongoCollection<T> collection) {
        return (T) collection.find().first();
    }

    public static <T> T findFirst(MongoCollection<T> collection, Bson bson) {
        return (T) collection.find(bson).first();
    }

    public static interface User {
        String dev();
    }

    public static class JavaUser implements User{
        public String name;

        public JavaUser() {
        }

        public JavaUser(String name) {
            this.name = name;
        }

        @Override
        public String dev() {
            return "java";
        }

        @Override
        public String toString() {
            return "JavaUser{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }

    public static class PythonUser implements User{
        public String name;
        public String age;

        public PythonUser() {
        }

        public PythonUser(String name, String age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public String dev() {
            return "python";
        }

        @Override
        public String toString() {
            return "PythonUser{" +
                    "name='" + name + '\'' +
                    ", age='" + age + '\'' +
                    '}';
        }
    }

    public static class TestUser {
        public String name;
        public User user;

        public TestUser() {
        }

        public TestUser(String name, User user) {
            this.name = name;
            this.user = user;
        }

        @Override
        public String toString() {
            return "TestUser{" +
                    "name='" + name + '\'' +
                    ", user=" + user +
                    '}';
        }
    }
}