最近在开发微服务项目,需要写成多模块的结构,又是一个新手,对其中的一些细节配置还不甚清晰,也找了其他大佬的博客参考,以下是我的项目部分
项目结构
总共有六个模块,最后是controller模块注册到注册中心去
遇到问题及解决方案
1、引入dao模块失败
首先是把数据库的配置写在controller模块的application.yml里,因为只有这个模块才会注册到eureka上。我看到很多博客上写需要写一个注解@MapperScan进行mapper的扫描,确实是要加,我这边是写了两个配置类,一个是mybatis配置,另一个是MapperScan的配置类
@Configuration
public class MybatisConfig {
@Value("${mybatis.mapper-locations}")
private String mapperLocationPattern;
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource(){return new com.alibaba.druid.pool.DruidDataSource();
}
@Bean(name="sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory() throws Exception{
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources(mapperLocationPattern));
return sqlSessionFactoryBean.getObject();
}
}
@Configuration
@AutoConfigureAfter(MybatisConfig.class)
@MapperScan("com.boss.train.permission.dao.permissiondao.mapper")
public class MybatisMapperScannerConfig {
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
mapperScannerConfigurer.setBasePackage("com.boss.train.permission.dao.permissiondao.mapper");
return mapperScannerConfigurer;
}
}
将这两个配置写在controller模块后测试能够成功
2、service模块导入失败
在controller模块测试service模块时,使用@Autowired注解注入service时报错,因为此时并没有扫描到service,需要在启动类上进行包的一个扫描,我这边扫描包的范围设置的比较大,基本上全部的包都可以被扫描到
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class},scanBasePackages = {"com.boss.train.permission"})
3、运行项目时发现修改数据能够成功且数据库也更新了,但是页面没有进行更新
在项目里我使用了redis进行缓存,查询到的数据会进行缓存,之后的查询就不再走数据库了,而是直接从缓存中读取。我在service模块方法里加了缓存注解@Cacheable和@CachePut,后面我在更新的方法上将注解换成了@CacheEvict,更新后删除redis中的缓存,后面页面显示正常