Bladeren bron

不支持懒加载的mongoTemplate2

deason 2 jaren geleden
bovenliggende
commit
170d4cf83d

+ 44 - 0
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/config/MongoConfig.java

@@ -0,0 +1,44 @@
+package cn.com.qmth.examcloud.core.questions.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.mongodb.MongoDatabaseFactory;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.convert.DbRefResolver;
+import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
+import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
+import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
+
+@Configuration
+public class MongoConfig {
+
+    private final MongoDatabaseFactory mongoDbFactory;
+
+    private final MongoMappingContext mongoMappingContext;
+
+    public MongoConfig(MongoDatabaseFactory mongoDbFactory, MongoMappingContext mongoMappingContext) {
+        this.mongoDbFactory = mongoDbFactory;
+        this.mongoMappingContext = mongoMappingContext;
+    }
+
+    @Primary
+    @Bean(name = "mongoTemplate")
+    public MongoTemplate mongoTemplate() {
+        // 支持懒加载
+        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
+        MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
+        // converter.setTypeMapper(new DefaultMongoTypeMapper(null));
+        return new MongoTemplate(mongoDbFactory, converter);
+    }
+
+    @Bean(name = "mongoTemplate2")
+    public MongoTemplate mongoTemplate2() {
+        // 不支持懒加载
+        DbRefResolver dbRefResolver = MyDbRefResolver.INSTANCE;
+        MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
+        // converter.setTypeMapper(new DefaultMongoTypeMapper(null));
+        return new MongoTemplate(mongoDbFactory, converter);
+    }
+
+}

+ 44 - 0
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/config/MyDbRefResolver.java

@@ -0,0 +1,44 @@
+package cn.com.qmth.examcloud.core.questions.config;
+
+import com.mongodb.DBRef;
+import org.bson.Document;
+import org.springframework.data.mongodb.core.convert.DbRefProxyHandler;
+import org.springframework.data.mongodb.core.convert.DbRefResolver;
+import org.springframework.data.mongodb.core.convert.DbRefResolverCallback;
+import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
+import org.springframework.lang.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public enum MyDbRefResolver implements DbRefResolver {
+
+    INSTANCE;
+
+    @Override
+    @Nullable
+    public Object resolveDbRef(MongoPersistentProperty property, @Nullable DBRef dbref,
+                               DbRefResolverCallback callback, DbRefProxyHandler proxyHandler) {
+        return callback.resolve(property);
+    }
+
+    @Override
+    @Nullable
+    public Document fetch(DBRef dbRef) {
+        Document document = new Document();
+        document.put("_id", dbRef.getId());
+        return document;
+    }
+
+    @Override
+    public List<Document> bulkFetch(List<DBRef> dbRefs) {
+        List<Document> list = new ArrayList<>();
+        for (DBRef dbRef : dbRefs) {
+            Document document = new Document();
+            document.put("_id", dbRef.getId());
+            list.add(document);
+        }
+        return list;
+    }
+
+}