gpt4 book ai didi

java - 使用java的mongo驱动程序保存接口(interface)对象列表

转载 作者:行者123 更新时间:2023-11-30 02:17:41 25 4
gpt4 key购买 nike

我有一个 POJO,它有一个 Resource 列表,它是 ResourceType1ResourceType2 的接口(interface)

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

我在数据库类中使用 mongodb-driver-core-3.5.0 来保存和检索 myPojo

我在保存时遇到错误并创建了文档,但当我使用 MongoCompass 检查保存的文档时,资源列表为空。

这是错误:

org.bson.codecs.configuration.CodecConfigurationException: Failed to decode 'resources'. An exception occurred when decoding using the AutomaticPojoCodec.
Decoding into a 'Resource' failed with the following exception:

Cannot find a public constructor for 'Resource'.

A custom Codec or PojoCodec may need to be explicitly configured and registered to handle this type.
at org.bson.codecs.pojo.PojoCodecImpl.decodePropertyModel(PojoCodecImpl.java:173)
at org.bson.codecs.pojo.PojoCodecImpl.decodeProperties(PojoCodecImpl.java:149)
at org.bson.codecs.pojo.PojoCodecImpl.decode(PojoCodecImpl.java:103)
at org.bson.codecs.pojo.PojoCodecImpl.decode(PojoCodecImpl.java:107)
...

我过去也遇到过类似的问题,只是写了一个 MyPojoWrapper 我手动编码和取消编码所有内容。然而我不得不相信这种情况更常见,而且我没有看到一个简单的解决办法。预先感谢您。

最佳答案

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

关于java - 使用java的mongo驱动程序保存接口(interface)对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47800882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com