Spring boot配置MongoDB以及Morphia踩坑记录
pom
因为项目中采用Morphia
(MongoDB
的ODM
框架,对象-文档映射(object-document mapper
)),因此需要在pom
文件中引入相应依赖:
<dependency>
<groupId>dev.morphia.morphia</groupId>
<artifactId>core</artifactId>
<version>1.5.3</version>
</dependency>
因为Morphia
依赖于mongo-java-driver
,因此无需在pom
文件中继续导入mongo-java-driver
.
配置
(1) 配置文件
application.yaml
中配置如下所示:
data:
mongodb:
database: {数据库名称}
uri: mongodb://{用户名}:{密码}@{服务器地址}:27017/{数据库名称}
上述配置中,
{}
包围的地方请按照各自项目实际情况填写.
(2) 代码配置
@Data
@Configuration
public class MorphiaConfig {
private MongoClient mongoClient;
/**
* 设置连接最大空闲时间(到达时间,连接关闭)
* @return mongo client属性
*/
@Bean
public MongoClientOptions mongoClientOptions() {
return MongoClientOptions.builder()
.maxConnectionIdleTime(6000 * 5)
.maxConnectionLifeTime(0)
.build();
}
@Autowired
public MorphiaConfig(MongoClient mongoClient) {
this.mongoClient = mongoClient;
}
@Bean
public Datastore datastore(@Autowired MongoClient mongoClient) {
Morphia res = new Morphia();
// 确定Mongo实体类的存放包名
res.mapPackage("com.test.log.entity");
Datastore datastore = res.createDatastore(mongoClient, "ops");
// 为实体类创建索引
datastore.ensureIndexes();
return datastore;
}
}
代码中无需自行配置MongoClient
(Spring boot
会自动完成MongoClient
的初始化),当然也允许自行设置Mongo
的连接参数.
实体类
项目中需要存放日志,并且通过MongoDB
的TTL
特性设置过期时间,以便通过MongoDB
完成日志删除任务.
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
// 必须添加,以便Morphia识别此类为`MongoDB`的实体类,`logInfo`是表名
@Entity(value = "logInfo", noClassnameStored = true)
@Indexes({
// expireTime存放日志过期时间,创建TTL index
@Index(fields = @Field(value = "expireTime"), options = @IndexOptions(expireAfterSeconds = 0)),
// 创建复合索引
@Index(fields = {@Field("deviceId"), @Field("module"), @Field(value = "time", type = DESC)}),
@Index(fields = {@Field("deviceId"), @Field(value = "time", type = DESC)})
})
public class LogInfo {
@Id
private ObjectId id;
private Date time;
@JsonIgnore
private Date expireTime;
private String module;
private String level;
private String deviceId;
private String msg;
}
日志的存放和读取是在不同的项目完成,在查询MongoDB
时遇到反序列化问题,异常如下所示:
WARN dev.morphia.mapping.DefaultCreator - Class not found defined in dbObj:
查询源码分析,是因为Morphia
在存储数据的时候,会将实体类
的名称
存入数据库中.
查询时Morphia
根据类名
查找相应的实体类
并进行反序列化
.
因为不同的项目中,实体类的包名不一致导致出现以上错误.
解决方案比较简单,通过注解告知Morphia
存储数据时不要存储包名即可,具体如下所示:
`@Entity(value = "logInfo", noClassnameStored = true)`.
CRUD
操作
(1) 存储操作
LogInfo logInfo = LogInfo.builder()
.time(dateTime)
.expireTime(dateExpireTime)
.level(level)
.module(module)
.deviceId(deviceId)
.msg(msg)
.build();
try {
//插入日志到mongoDB
datastore.save(logInfo);
} catch (RuntimeException e) {
log.error(AppStatus.IDB_WRITE_FAIL.getError(), e);
}
(2) 查询操作
final Query<LogInfo> query = datastore.createQuery(LogInfo.class).filter("deviceId = ", request.getDeviceId());
// 列表查询
if (!CollectionUtils.isEmpty(request.getModules())) {
query.filter("module in ", request.getModules().toArray());
}
// 根据时间查询,使用filter就不太恰当了
if (null != request.getStartTime()) {
query.field("time").greaterThanOrEq(request.getStartTime());
}
if (null != request.getFinishTime()) {
query.field("time").lessThanOrEq(request.getFinishTime());
}
// 查询记录总数
int count = query.count());
// 设置排序规则,查询具体数据
query.order(Sort.descending("time"));
// 获取数据游标
MongoCursor<LogInfo> logInfoMongoCursor = query.find(
new FindOptions()
.skip((request.getPageNum() - 1) * request.getPageSize())
.limit(request.getPageSize())
);
// 通过数据游标,逐个获取数据记录
while (logInfoMongoCursor.hasNext()) {
logInfoPage.add(logInfoMongoCursor.next());
}
删除以及更新操作就不再赘述,
Morphia
接口比较明晰,容易入门.
PS:
如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!
Spring boot配置MongoDB以及Morphia踩坑记录的更多相关文章
- Spring Boot 开发系列一 开发踩坑
这是学习spring boot 的第二周,公司号称这玩意是啥都不会的新手就可以填空开发,于是决定上手一把,怎么说我也是搞了快七八年的.NET和.NETcore,没想到无情打脸,快被这个能填空开的IDE ...
- Win10 安装配置 MongoDB 4.0 踩坑记
redis 官方没有 Windows 版的,微软维护的已经好久没更新了,所以就在想着换成 MongoDB. 于是一趟被我复杂化的踩坑之旅就开始了,同时也记录一下,避免有人遇见跟我一样的问题. 首先在 ...
- 踩坑记录:spring boot的POST请求数据注入不了的问题
概述: 今天在使用spring boot框架的时候,踩了一个坑,是关于control层request body依赖注入的问题的,内容如下: 进过: 由于目前公司采用的系统架构,要求把springboo ...
- spring boot +dubbo 踩坑记录
今天初次搭建spring boot +duboo的demo.记录一下踩坑记录. 首先搭建3个小demo,一个maven项目,两个spring boot (服务提供者和服务消费者)项目. 两 sprin ...
- springboot(十一):Spring boot中mongodb的使用
mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...
- (转)Spring Boot(十一):Spring Boot 中 MongoDB 的使用
http://www.ityouknow.com/springboot/2017/05/08/spring-boot-mongodb.html MongoDB 是最早热门非关系数据库的之一,使用也比较 ...
- Spring Boot(十一):Spring Boot 中 MongoDB 的使用
MongoDB 是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配 ...
- 使用spring boot访问mongodb数据库
一. spring boot中传参的方法 1.自动化配置 spring Boot 对于开发人员最大的好处在于可以对 Spring 应用进行自动配置.Spring Boot 会根据应用中声明的第三方依赖 ...
- MongoDB最简单的入门教程之四:使用Spring Boot操作MongoDB
Spring Boot 是一个轻量级框架,可以完成基于 Spring 的应用程序的大部分配置工作.Spring Boot的目的是提供一组工具,以便快速构建容易配置的Spring应用程序,省去大量传统S ...
随机推荐
- 使用opencv320演示window平台cmake的使用方法以及一个使用CNN识别字符的例子 20180408
cmake是干啥的: 本来是Linux平台的一个编译工具. window平台上,cmake可以生成一个可以用vs(可以指定)打开的工程,然后使用 vs 编译相关的 lib.dll 或者 exe以供使用 ...
- Maven 本地仓库同步到私服中
步骤: 第一步:找到安装私服的目录中plexus.properties文件. 地址:C:\Windows\apache-tomcat-7.0.26\webapps\nexus-2.7.0-06\WEB ...
- BOI 2003 团伙
洛谷 P1892 [BOI2003]团伙 洛谷传送门 题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋 ...
- Dubbo服务集群容错
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- web框架--tornado框架之初识
在python中常见的web框架构建模式有以下两种: *MVC框架: * 数据库相关操作的Models 视图文件的Views 业务逻辑的Controllers MTV框架: 数据库相关操作的Model ...
- Spring Cloud Gateway 之 AddRequestHeader GatewayFilter Factory
今天我们来学习下GatewayFilter Factory,中文解释就是过滤器工厂. 官方文档对GatewayFilter Factory的介绍: Route filters allow the mo ...
- 教你查阅Java API 英文文档(JDK 11)
JAVA Document:https://docs.oracle.com/en/java/javase/11/ 然后找到“Specifications”并点击 API Documentation 比 ...
- 第02组 Alpha事后诸葛亮
目录 1. 组长博客(2分) 2. 总结思考(27分) 2.1. 设想和目标(2分) 2.2. 计划(5分) 2.3. 资源(3分) 2.4. 变更管理(4分) 2.5. 设计/实现(4分) 2.6. ...
- 第25课 std::thread对象的析构
一. 线程的等待与分离 (一)join和detach函数 1. 线程等待:join() (1)等待子线程结束,调用线程处于阻塞模式. (2)join()执行完成之后,底层线程id被设置为0,即join ...
- 查看linux中某个端口port是否被利用
(1)lsof -i:端口号查看某个端口是否被占用 (2)netstat -an|grep 80 netstat -- show network status (3)杀掉进程 kill pid 注意: ...