当前位置:   article > 正文

【新手任务】一 springboot demo_required a bean of type 'org.springframework.data.

required a bean of type 'org.springframework.data.mongodb.core.mongotemplate

项目场景:

提示:这里简述项目相关背景:

需求:
spring boot框架搭建 web api项目:eastmoney.demo.api
1、实现基于oracle库emdata用户表的查询接口,或者自建mongodb的user库
select * from emtxz.t_user_info
2、实现基于mongodb库,userInfo的增删改查接口,数据字段可移植2~3个t_user_info 表的关键字段即可。包括userInfo建表脚本。
3、实现基于redis缓存,userInfo的查询接口,缓存击穿后数据取mongo库的userInfo表。有缓存策略。


实现步骤

1、搭建spring boot +grandle + mongoDB框架,在build.grandle中添加相关依赖()

2、本地安装mongoDB(https://blog.csdn.net/weixin_41466575/article/details/105326230)

3、mongoDB进行相关配置,启动mongoDB(在windows资源管理器中shift+右键打开powershell ,然后执行mongod -dbpath C:\MongoDB\data\db 命令)

4、项目中补充相关mongoDB配置文件

5、写个单测康康项目和mongoDB的连接有没有问题(用studio 3T图形化mongoDB以查看是否已完成写入):

@Autowired
private MongoTemplate mongoTemplate;
 
//添加操作
@Test
public void contextLoads() {
    User user = new User();
    user.setAge(20);
    user.setName("test");
    user.setEmail("123@qq.com");
    User user1 = mongoTemplate.insert(user);
    System.out.println(user1);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

6、用mongotemplate实现CRUD接口
7、本地安装redis()
8、项目连接redis
9、选择缓存策略

Cache Aside Pattern(旁路缓存模式)

读写步骤
写:

先更新DB。

然后直接删除cache。

(用@CacheEvict实现

读:

从cache中读取数据,读取到就直接返回。

cache中读取不到的话,就从DB读取返回。

再把数据写到cache中。

(用 @Cacheable实现

10、按照缓存策略写代码
在这里插入图片描述
在这里插入图片描述
11、测试结果

  1. 给适合做缓存的查询方法添加@Cacheable注解

     DEGUB过程中发现,如果缓存不命中,则执行查询方法内的逻辑;如果命中缓存则直接返回缓存结果
    
    • 1

2)给update方法添加@CacheEvict注解

 DEBUG过程中发现,如果原本缓存中存在数据,在调用update方法后缓存中对应数据将被删除
  • 1

遇到的问题

1、MongoTemplate注入失败
问题:
required a bean of type ‘org.springframework.data.mongodb.core.MongoTemplate’ that could not be found

原因:
SpringBoot的版本较高,不支持直接注入MongoTemplate,即仅使用下述内容会出现上述错误:

@Autowired
private MongoTemplate mongoTemplate;
  • 1
  • 2

由mongodb官方文档可知,与之前大不相同,需要手动创建MongoDB配置类:

@Configuration
public class MongoDBConfig {
@Bean
public MongoClient mongoClient() {
return MongoClients.create("mongodb://localhost:27017");
}
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(mongoClient(), "mydatabase");
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2、

错误描述:

java.lang.NoSuchMethodError: com.mongodb.client.MongoCollection.insertOne(Ljava/lang/Object;)Lcom/mongodb/client/result/InsertOneResult;
  • 1

错误原因: build.grandle 文件存在两个不同版本的依赖,版本低的可能无法正常操作MongoDB数据库

解决方法:注释低版本依赖

//mongodb
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
//implementation 'org.mongodb:mongodb-driver:3.3.0'
  • 1
  • 2
  • 3

3、mongodb 在cmd中设置为系统服务时出错

使用命令:

mongod.exe --logpath D:\MongoDB_Data\log\mongodb.log --logappend --dbpath D:\MongoDB_Data\data --directoryperdb --serviceName MongoDB --install

4、@Cacheable配置序列化方式?

可以重写RedisCacheConfiguration:

/设置@Cacheable序列化方式

@Bean
public RedisCacheConfiguration redisCacheConfiguration(){
 FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
 RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();
 configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofDays(30));
 return configuration;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

5、配置Mongotemplate去掉库表中的_class字段?

这个字段主要是为了在将Mongo的数据还原到Java的时候能找到对应的类,要去掉的方法简单:DefaultMongoTypeMapper类的构造函数的第一个参数是Type在MongoDB中名字. 设置为null的话就不会在保存时自动添加_class属性.所以需要覆写

一阶段问题

架构方面:

1、测试类创建路径应该对应每个SERVICE层

2、CONTROLLER层不应该写过多业务逻辑,业务逻辑放到SERVICE层

3、前端传入数据应该用单独结构体获取(如xxInfo)再写转换逻辑转换为数据库结构体

4、像传统的springMVC架构

细节方面:

1、关键步骤添加多一些注释

2、尽量用post写http接口(因为post可接收的数据量更大,且通过解析json格式数据完成接口调用的通用性更强)

3、对于外部数据应当编写规则校验的逻辑

4、对于特殊情况(空值等)进行兜底处理

5、使用sl4j搭配try-catch进行日志输出

6、mongoDB要去除_class字段

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/125763
推荐阅读
相关标签
  

闽ICP备14008679号