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>异常: 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> </p>
<p> </p>
<p><img src="https://img2018.cnblogs.com/blog/1088776/201910/1088776-20191019112420529-1983540814.png"></p>
<p> </p>
<p> </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<BigDecimal, Decimal128><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<Decimal128, BigDecimal><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 && <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><Object> list = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList<><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><Blacklist> 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()>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><?xml version="1.0" encoding="UTF-8"?>
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wolf</groupId>
<artifactId>mongodbit</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mongodbit</name>
<description>Demo project <span style="color: rgba(0, 0, 255, 1)">for</span> Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--lombok自动生成实体类get/set方法 start-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--lombok自动生成实体类get/set方法 end-->
<!--mongodb引入 start -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
</dependency>
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
-->
<!--mongodb引入 end -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project></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> </p>
<p> </p>
<p>结果完美!</p>
<p> </p>
<p>时间有限,有些地方可能不是很完美!不足之处请大牛指出,谢谢!</p>
<p>有需要代码的我之后将会发布到git上!</p>
<p>https://github.com/topsnowwolf/mongodbit</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/muxi0407/p/11703316.html
頁:
[1]