使用mongo driver for java保存接口对象列表
我有一个POJO,它有一个使用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
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 +
'}';
}
}
}