中国化学 發表於 2019-10-19 11:30:00

springboot整合mongodb问题1-Decimal128和BigDecimal的转换之mongodb转换器使用(转)

<p>转自:https://blog.csdn.net/weixin_41792559/article/details/79575524</p>
<p>1.Decimal128的了解<br>由于mongodb4.3以上新加了Decimal128类型。Decimal128类型对小数给了最好的支持,而double类型对小数存在精度的问题。个人觉得Decimal128还是不错的。但是我测试发现spring-data-mongodb 1.*和现在的spring-data-mongodb2.0.5目前不支持Decimal128自动转换为java的BigDecimal类型。<br>异常:&nbsp;No converter found capable of converting from type to type <br>大概就是描述:没有Decimal128转换成BigDecimal的转换器。</p>
<p><img src="https://img2018.cnblogs.com/blog/1088776/201910/1088776-20191019112407987-1886580310.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2018.cnblogs.com/blog/1088776/201910/1088776-20191019112420529-1983540814.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>2.访问mongodb方式:spring-data-mongodb的MongoTemplate。<br>目前先以spring-data-mongodb的MongoTemplate方式为案例。之后我会增加mongodb原始的dom处理方式,以及spring-boot-starter-data-mongodb下开启了对Repository的支持方式进行测试一下。(进行了测试)<br>代码:https://github.com/topsnowwolf/mongodbit</p>
<p>3.如何解决Decimal128,BigDecimal的类型转换问题呢?<br>思路:没有转换器我们新加一个转换。如何新加呢?增加之后如何配置呢?这就是重点了。<br>首先spring增加类型转换器有 三种方式。</p>
<p>1.实现GenericConverter接口</p>
<p>2.实现ConverterFactory接口</p>
<p>3.实现Converter接口</p>
<p>这三种方式分别如何实现类型转换器,我就不多说了。网上很多例子。</p>
<p>下面我就以实现Converter接口方式的来实现。</p>
<p>自定义类型转换器:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.wolf.mongodbit.converter;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.bson.types.Decimal128;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.core.convert.converter.Converter;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.convert.ReadingConverter;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.convert.WritingConverter;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.math.BigDecimal;

@ReadingConverter
@WritingConverter
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> BigDecimalToDecimal128Converter <span style="color: rgba(0, 0, 255, 1)">implements</span> Converter&lt;BigDecimal, Decimal128&gt;<span style="color: rgba(0, 0, 0, 1)"> {
   
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Decimal128 convert(BigDecimal bigDecimal) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Decimal128(bigDecimal);
    }
   
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.wolf.mongodbit.converter;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.bson.types.Decimal128;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.core.convert.converter.Converter;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.convert.ReadingConverter;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.convert.WritingConverter;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.math.BigDecimal;

@ReadingConverter
@WritingConverter
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> Decimal128ToBigDecimalConverter <span style="color: rgba(0, 0, 255, 1)">implements</span> Converter&lt;Decimal128, BigDecimal&gt;<span style="color: rgba(0, 0, 0, 1)"> {

    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> BigDecimal convert(Decimal128 decimal128) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> decimal128.bigDecimalValue();
    }
   
   

}</span></pre>
</div>
<p>下面我就分析一下MongoTemplate的源码。</p>
<p>我们先带着问题去看。我们增加了转换器,这个转换器是给访问mongodb用的,那肯定是给MongoTemplate设置新的转换器了。</p>
<p>打开MongoTemplate这个类,果然如此。MongoTemplate的构造方法中就有一个参数是设置类型转换器的。看到希望了。哈哈!</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter mongoConverter) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.writeConcernResolver =<span style="color: rgba(0, 0, 0, 1)"> DefaultWriteConcernResolver.INSTANCE;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.writeResultChecking =<span style="color: rgba(0, 0, 0, 1)"> WriteResultChecking.NONE;
      Assert.notNull(mongoDbFactory, </span>"MongoDbFactory must not be null!"<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.mongoDbFactory =<span style="color: rgba(0, 0, 0, 1)"> mongoDbFactory;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.exceptionTranslator =<span style="color: rgba(0, 0, 0, 1)"> mongoDbFactory.getExceptionTranslator();
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.mongoConverter = mongoConverter == <span style="color: rgba(0, 0, 255, 1)">null</span> ?<span style="color: rgba(0, 0, 0, 1)"> getDefaultMongoConverter(mongoDbFactory) : mongoConverter;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.queryMapper = <span style="color: rgba(0, 0, 255, 1)">new</span> QueryMapper(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.mongoConverter);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.updateMapper = <span style="color: rgba(0, 0, 255, 1)">new</span> UpdateMapper(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.mongoConverter);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.mappingContext = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.mongoConverter.getMappingContext();
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">null</span> != <span style="color: rgba(0, 0, 255, 1)">this</span>.mappingContext &amp;&amp; <span style="color: rgba(0, 0, 255, 1)">this</span>.mappingContext <span style="color: rgba(0, 0, 255, 1)">instanceof</span><span style="color: rgba(0, 0, 0, 1)"> MongoMappingContext) {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.indexCreator = <span style="color: rgba(0, 0, 255, 1)">new</span> MongoPersistentEntityIndexCreator((MongoMappingContext)<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.mappingContext, mongoDbFactory);
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.eventPublisher = <span style="color: rgba(0, 0, 255, 1)">new</span> MongoMappingEventPublisher(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.indexCreator);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.mappingContext <span style="color: rgba(0, 0, 255, 1)">instanceof</span><span style="color: rgba(0, 0, 0, 1)"> ApplicationEventPublisherAware) {
                ((ApplicationEventPublisherAware)</span><span style="color: rgba(0, 0, 255, 1)">this</span>.mappingContext).setApplicationEventPublisher(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.eventPublisher);
            }
      }

    }</span></pre>
</div>
<p>最终发现MongoConverter是一个接口。那一定有实现它的类。查一下api发现,抽象的类AbstractMongoConverter,最后是MappingMongoConverter类。此时就会发现AbstractMongoConverter类中有setCustomConversions设置自定义类型转换器的set方法。现在兴奋了吧!!!</p>
<p>现在大概的思路就是通过创建一个MappingMongoConverter对象,将定义的类型转换器调用setCustomConversions方法进行注册。最后调用MongoTemplate的构造方法得到MongoTemplate对象。</p>
<p>废话不多说上代码:</p>
<p>自定义一个配置类:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.wolf.mongodbit.config;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.mongodb.MongoClient;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.mongodb.MongoClientURI;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.wolf.mongodbit.converter.BigDecimalToDecimal128Converter;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.wolf.mongodbit.converter.Decimal128ToBigDecimalConverter;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.context.annotation.Bean;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.context.annotation.Configuration;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.MongoDbFactory;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.config.AbstractMongoConfiguration;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.MongoTemplate;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.SimpleMongoDbFactory;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.convert.MappingMongoConverter;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.convert.MongoCustomConversions;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.mapping.MongoMappingContext;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.ArrayList;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.List;
@Configuration
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MongodbConfig <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> AbstractMongoConfiguration{
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> String dbName = "wolf"<span style="color: rgba(0, 0, 0, 1)">;
    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MongoClient mongoClient() {
      MongoClient mongoClient </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MongoClient();
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mongoClient;
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">protected</span><span style="color: rgba(0, 0, 0, 1)"> String getDatabaseName() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> dbName;
    }
    @Bean
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> MappingMongoConverter mappingMongoConverter() <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception {
      DefaultDbRefResolver dbRefResolver </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> DefaultDbRefResolver(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.dbFactory());
      MappingMongoConverter converter </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> MappingMongoConverter(dbRefResolver, <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.mongoMappingContext());
      List</span>&lt;Object&gt; list = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">();
      list.add(</span><span style="color: rgba(0, 0, 255, 1)">new</span> BigDecimalToDecimal128Converter());<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">自定义的类型转换器</span>
      list.add(<span style="color: rgba(0, 0, 255, 1)">new</span> Decimal128ToBigDecimalConverter());<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">自定义的类型转换器</span>
      converter.setCustomConversions(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MongoCustomConversions(list));
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> converter;
    }
    @Bean
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> MongoDbFactory dbFactory() <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> SimpleMongoDbFactory(<span style="color: rgba(0, 0, 255, 1)">new</span> MongoClientURI("mongodb://localhost:27017/wolf"<span style="color: rgba(0, 0, 0, 1)">));
    }
    @Bean
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MongoMappingContext mongoMappingContext() {
      MongoMappingContext mappingContext </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MongoMappingContext();
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mappingContext;
    }
    @Bean
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> MongoTemplate mongoTemplate() <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> MongoTemplate(<span style="color: rgba(0, 0, 255, 1)">this</span>.dbFactory(), <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.mappingMongoConverter());
    }
}</span></pre>
</div>
<p>实体类:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.wolf.mongodbit.entity.mongodb;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> lombok.Data;

@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Address {
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String aCode;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String add;
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.wolf.mongodbit.entity.mongodb;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> lombok.Data;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.bson.types.ObjectId;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.mapping.Document;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Date;


@Document(collection</span>="blacklist"<span style="color: rgba(0, 0, 0, 1)">)
@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Blacklist {
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> ObjectId objectId;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String username;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String userid;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String blacktype;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String status;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Date update;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Date indate;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Address address;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Comments comments;
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.wolf.mongodbit.entity.mongodb;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> lombok.Data;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.math.BigDecimal;
@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Comments {
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String cause;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String desc;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> BigDecimal money;
}</span></pre>
</div>
<p>测试的controller:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.wolf.mongodbit.controller;


</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.wolf.mongodbit.entity.mongodb.Blacklist;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.slf4j.Logger;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.slf4j.LoggerFactory;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.beans.factory.annotation.Autowired;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.MongoTemplate;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Query;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.web.bind.annotation.PostMapping;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.web.bind.annotation.RequestMapping;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.web.bind.annotation.RestController;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.List;

</span><span style="color: rgba(0, 0, 255, 1)">import</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Criteria.where;
</span><span style="color: rgba(0, 0, 255, 1)">import</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Query.query;

@RestController
@RequestMapping(</span>"/mongodb"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> BlackListController {
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">static</span> Logger logger = LoggerFactory.getLogger(BlackListController.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
    @Autowired
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> MongoTemplate mongoTemplate;
    @PostMapping(</span>"/check"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Blacklist checkBlack(Blacklist blackList){
      List</span>&lt;Blacklist&gt; list = mongoTemplate.find(query(where("userid").is(blackList.getUserid())), Blacklist.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
      logger.info(</span>"springboot+mongodb:size={}"<span style="color: rgba(0, 0, 0, 1)">,list.size());
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(list.size()&gt;0<span style="color: rgba(0, 0, 0, 1)">)
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> list.get(0<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}</span></pre>
</div>
<p>pom配置文件:</p>
<div class="cnblogs_code">
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<span style="color: rgba(0, 0, 0, 1)">
    xsi:schemaLocation</span>="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&gt;
    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;

    &lt;groupId&gt;com.wolf&lt;/groupId&gt;
    &lt;artifactId&gt;mongodbit&lt;/artifactId&gt;
    &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
    &lt;packaging&gt;jar&lt;/packaging&gt;

    &lt;name&gt;mongodbit&lt;/name&gt;
    &lt;description&gt;Demo project <span style="color: rgba(0, 0, 255, 1)">for</span> Spring Boot&lt;/description&gt;

    &lt;parent&gt;
      &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
      &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
      &lt;version&gt;2.0.0.RELEASE&lt;/version&gt;
      &lt;relativePath/&gt; &lt;!-- lookup parent from repository --&gt;
    &lt;/parent&gt;

    &lt;properties&gt;
      &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
      &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt;
      &lt;java.version&gt;1.8&lt;/java.version&gt;
    &lt;/properties&gt;

    &lt;dependencies&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
      &lt;/dependency&gt;

      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
            &lt;scope&gt;test&lt;/scope&gt;
      &lt;/dependency&gt;

      &lt;!--lombok自动生成实体类get/set方法 start--&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
            &lt;artifactId&gt;lombok&lt;/artifactId&gt;
      &lt;/dependency&gt;
      &lt;!--lombok自动生成实体类get/set方法 end--&gt;
      
      &lt;!--mongodb引入 start --&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.data&lt;/groupId&gt;
            &lt;artifactId&gt;spring-data-mongodb&lt;/artifactId&gt;
      &lt;/dependency&gt;
      &lt;!--
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-data-mongodb&lt;/artifactId&gt;
      &lt;/dependency&gt;
      --&gt;
      &lt;!--mongodb引入 end --&gt;
    &lt;/dependencies&gt;

    &lt;build&gt;
      &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
            &lt;/plugin&gt;
      &lt;/plugins&gt;
    &lt;/build&gt;


&lt;/project&gt;</pre>
</div>
<p>yml配置文件:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">#访问项目的url前缀
server:
servlet:
    context</span>-path: /mongodb</pre>
</div>
<p>mongodb的测试数据:</p>
<div class="cnblogs_code">
<pre>var blacklist1 =<span style="color: rgba(0, 0, 0, 1)"> {
      </span>"username" : "snowwolf"<span style="color: rgba(0, 0, 0, 1)">,
      </span>"userid" : "2018001014344"<span style="color: rgba(0, 0, 0, 1)">,
      </span>"address"<span style="color: rgba(0, 0, 0, 1)"> : {
                </span>"aCode" : "0020"<span style="color: rgba(0, 0, 0, 1)">,
                </span>"add" : "广州"<span style="color: rgba(0, 0, 0, 1)">
      },
      </span>"certificate"<span style="color: rgba(0, 0, 0, 1)">:{
            </span>"certificateid":"20018554111134"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"certificatetype":"01"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"desc":"学生证"<span style="color: rgba(0, 0, 0, 1)">
      },
       </span>"blacktype" : "01"<span style="color: rgba(0, 0, 0, 1)">,
       </span>"comments"<span style="color: rgba(0, 0, 0, 1)">:{
            </span>"cause":"01"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"desc":"逾期欠费"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"money":NumberDecimal("18889.09"<span style="color: rgba(0, 0, 0, 1)">)
       },
       </span>"status":"01"<span style="color: rgba(0, 0, 0, 1)">,
       </span>"update" : ISODate("2017-12-06T04:26:18.354Z"<span style="color: rgba(0, 0, 0, 1)">),
       </span>"indate" : ISODate("2017-12-06T04:26:18.354Z"<span style="color: rgba(0, 0, 0, 1)">)
      
};
var blacklist2 </span>=<span style="color: rgba(0, 0, 0, 1)"> {
      </span>"username" : "lison"<span style="color: rgba(0, 0, 0, 1)">,
      </span>"userid" : "2018001014345"<span style="color: rgba(0, 0, 0, 1)">,
      </span>"address"<span style="color: rgba(0, 0, 0, 1)"> : {
                </span>"aCode" : "0075"<span style="color: rgba(0, 0, 0, 1)">,
                </span>"add" : "深圳"<span style="color: rgba(0, 0, 0, 1)">
      },
      </span>"certificate"<span style="color: rgba(0, 0, 0, 1)">:{
            </span>"certificateid":"20018554111134"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"certificatetype":"02"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"desc":"护照"<span style="color: rgba(0, 0, 0, 1)">
      },
       </span>"blacktype" : "01"<span style="color: rgba(0, 0, 0, 1)">,
       </span>"comments"<span style="color: rgba(0, 0, 0, 1)">:{
            </span>"cause":"02"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"desc":"恶意欠费"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"money":NumberDecimal("188890.00"<span style="color: rgba(0, 0, 0, 1)">)
       },
       </span>"status":"01"<span style="color: rgba(0, 0, 0, 1)">,
       </span>"update" : ISODate("2016-01-06T04:26:18.354Z"<span style="color: rgba(0, 0, 0, 1)">),
       </span>"indate" : ISODate("2015-12-06T04:26:18.354Z"<span style="color: rgba(0, 0, 0, 1)">)
      
};
var blacklist3 </span>=<span style="color: rgba(0, 0, 0, 1)"> {
      </span>"username":"tom"<span style="color: rgba(0, 0, 0, 1)">,
      </span>"userid":"2018001014346"<span style="color: rgba(0, 0, 0, 1)">,
      </span>"address"<span style="color: rgba(0, 0, 0, 1)">:{
                </span>"aCode" : "0020"<span style="color: rgba(0, 0, 0, 1)">,
                </span>"add" : "广州"<span style="color: rgba(0, 0, 0, 1)">
      },
      </span>"certificate"<span style="color: rgba(0, 0, 0, 1)">:{
            </span>"certificateid":"20018554111136"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"certificatetype":"01"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"desc":"学生证"<span style="color: rgba(0, 0, 0, 1)">
      },
       </span>"blacktype":"01"<span style="color: rgba(0, 0, 0, 1)">,
       </span>"comments"<span style="color: rgba(0, 0, 0, 1)">:{
            </span>"cause":"03"<span style="color: rgba(0, 0, 0, 1)">,
            </span>"desc":"公安机关确定的涉嫌短信欺诈、诈骗等犯罪行为的用户"<span style="color: rgba(0, 0, 0, 1)">
       },
       </span>"status":"01"<span style="color: rgba(0, 0, 0, 1)">,
       </span>"update":ISODate("2017-12-06T04:26:18.354Z"<span style="color: rgba(0, 0, 0, 1)">),
       </span>"indate":ISODate("2017-12-06T04:26:18.354Z"<span style="color: rgba(0, 0, 0, 1)">)
      
};

db.blacklist.insert(blacklist1);
db.blacklist.insert(blacklist2);
db.blacklist.insert(blacklist3);
</span></pre>
</div>
<p>在postman中测试:</p>
<p><img src="https://img2018.cnblogs.com/blog/1088776/201910/1088776-20191019112849330-1275450623.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>结果完美!</p>
<p>&nbsp;</p>
<p>时间有限,有些地方可能不是很完美!不足之处请大牛指出,谢谢!</p>
<p>有需要代码的我之后将会发布到git上!</p>
<p>https://github.com/topsnowwolf/mongodbit</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/muxi0407/p/11703316.html
頁: [1]
查看完整版本: springboot整合mongodb问题1-Decimal128和BigDecimal的转换之mongodb转换器使用(转)