MongoConfiguration.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package com.zswl.dataservicestarter.config;
  2. import com.mongodb.ReadPreference;
  3. import com.zswl.dataservicestarter.config.converts.BigDecimalToDecimal128Converter;
  4. import com.zswl.dataservicestarter.config.converts.Decimal128ToBigDecimalConverter;
  5. import org.bson.Document;
  6. import org.bson.codecs.DocumentCodec;
  7. import org.springframework.beans.BeanInstantiationException;
  8. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.ComponentScan;
  11. import org.springframework.context.annotation.Configuration;
  12. import org.springframework.context.annotation.Import;
  13. import org.springframework.data.mongodb.MongoDatabaseFactory;
  14. import org.springframework.data.mongodb.MongoTransactionManager;
  15. import org.springframework.data.mongodb.config.EnableMongoAuditing;
  16. import org.springframework.data.mongodb.core.MongoTemplate;
  17. import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
  18. import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
  19. import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
  20. import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
  21. import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
  22. import java.util.ArrayList;
  23. import java.util.List;
  24. /**
  25. * 集成自动配置
  26. */
  27. @Configuration
  28. @EnableMongoAuditing
  29. @ComponentScan({"com.zswl.dataservicestarter", "com.zswl.dataservicestarter.helper"})
  30. @EnableMongoRepositories("com.zswl.dataservicestarter.dao")
  31. @Import(PaginationConfiguration.class)
  32. public class MongoConfiguration {
  33. static {
  34. //jdk 11 以上,强制使用 TLSv1.3 , mongo 驱动目前兼容 TLSv1.2
  35. System.setProperty("jdk.tls.client.protocols", "TLSv1.2");
  36. }
  37. /**
  38. * 自定义转换器
  39. *
  40. * @param mongoDbFactory
  41. * @param mongoMappingContext
  42. * @return
  43. * @throws Exception
  44. */
  45. @Bean
  46. @ConditionalOnMissingBean
  47. public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory mongoDbFactory, MongoMappingContext mongoMappingContext) throws Exception {
  48. DefaultDbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
  49. MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
  50. List<Object> list = new ArrayList<>();
  51. list.add(new BigDecimalToDecimal128Converter());//自定义的类型转换器
  52. list.add(new Decimal128ToBigDecimalConverter());//自定义的类型转换器
  53. converter.setCustomConversions(new MongoCustomConversions(list));
  54. return converter;
  55. }
  56. /**
  57. * 事务
  58. *
  59. * @param dbFactory
  60. * @return
  61. */
  62. @Bean
  63. MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
  64. return new MongoTransactionManager(dbFactory);
  65. }
  66. /**
  67. * 配置读写分离
  68. *
  69. * @return
  70. */
  71. @Bean
  72. public ReadPreference readPreference(MongoTemplate mongoTemplate) {
  73. // 首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。
  74. ReadPreference readPreference = ReadPreference.primaryPreferred();
  75. mongoTemplate.setReadPreference(readPreference);
  76. return readPreference;
  77. }
  78. @Bean
  79. public DocumentCodec documentCodec(MongoDatabaseFactory dbFactory) {
  80. return new DocumentCodec(dbFactory.getCodecRegistry());
  81. }
  82. // @EventListener(ApplicationReadyEvent.class)
  83. // public void initIndicesAfterStartup() {
  84. //
  85. // IndexOperations indexOps = mongoTemplate.indexOps(DomainType.class);
  86. //
  87. // IndexResolver resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);
  88. // resolver.resolveIndexFor(DomainType.class).forEach(indexOps::ensureIndex);
  89. // }
  90. }