前言:
springboot总的来说是springmvc与spring的结合体,构建springboot项目少了很多不必要的配置,但是其中还是有一些需要关注的点需要注意到,本人在配置springboot中遇到一些大的小的坑,有一些以前配置ssm的都没注意到,随笔此文,方便日后查看。
1.启动项目出现:mybatis Field xxxMapper in xxxx required a bean of type ‘XXXMapper’ that could not be found。
原因:本人用的mybatis-generator插件自动生成实体和DAO层以及XML文件,springboot扫描不到你所生成的mapper.java类。
解决方案:
方法1:直接在你生成出来的xxxMapper.java类上加@Mapper标签。
方法2:项目启动application类加注释:@MapperScan(basePackages = { “xxx.xxx.mapper” }, sqlSessionFactoryRef = “sqlSessionFactory”),表示扫描xx.xx.mapper包下的所有mapper。 或者@MapperScan(xxx.mapper)。
2.关于mapper的配置
调用数据库时出现:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
原因:项目找不到你的Mapper.xml文件。
解决方案:先测试使用@Select、@Insert、@Update、@Delete注解自定义一个mapper接口类中的方法,如果不存在异常,那就是扫描xxxMapper.xml文件的问题了,
在项目自动生成的application.properties中声明这么一句:
mybatis.mapper-locations=classpath:com/duuuhs/miaosha_system/mapper/*Mapper.xml
当然具体的路径看实际情况而言,有些人的Mapper.xml放在了resource中,有些人则是放在了java文件下,根据实际情况去改就好了。
(
ps:之前看其他博客,有人说@MapperScan注解和mybatis.mapper-locations 两者缺一不可,在我这边没有出现这种两个都必须要配置才能执行的情况,可能是对项目构成还不是很牢固,先写下来吧。
以下引自别的博客评论:
首先@MapperScan注解仅仅是扫描Mapper接口类,而yml(properties)那里的mapper-locations是配置xml的,就你问题而言yml(properties)就是解决你xml加载问题。要正确启动两者缺一不可。
)
此外,还有一个解决思路,那就是查看target中相应的文件有没有编译进来。
3.启动项目出现:Field xxxService in xxxController required a bean of type ‘xxx.xxx.Service’ that could not be found.
原因:springboot没找到你的service。
解决方案:@Service一定要标注在实现方法impl中!@Service一定要标注在实现方法impl中!@Service一定要标注在实现方法impl中!重要的事情一定要说三遍。本人一开始很确信这个标签是有加的,查了半天才知道@Service标签被我不小心写到了接口上,一定要写在实现方法中springboot才会找到对应的方法。这个坑spring之类的同样适用。
4.项目控制器转发页面不成功,页面一直显示return的字符串,而不是相应的html页面。
原因:@RestController与@Controller用错了地方。
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。如果只是使用@RestController注解Controller,则Controller中的方法无法返回html页面,配置的视图解析器失效。
@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面。若返回json等内容到页面,则需要加@ResponseBody注解
解决方案:用@Controller替代@RestController。
5.关于mysql-connector-java的问题,
com.mysql.jdbc.Driver 是 mysql-connector-java 5中的,
com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6中的。
例如:JDBC连接Mysql5 com.mysql.jdbc.Driver:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
JDBC连接Mysql6 com.mysql.cj.jdbc.Driver, 需要指定时区serverTimezone:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=Shanghai&?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
6.静态文件css,js显示404。
解决方案:本人在application.properies配置了**spring.mvc.static-path-pattern=classpath:/static/****仍失败的情况下,在启动类中这么改:
public class MiaoshaSystemApplication extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//引入静态资源css,js无效时加上(ps:在application.properties配置也不生效)
registry.addResourceHandler("/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/static/");
//registry.addResourceHandler("/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/templates");
super.addResourceHandlers(registry);
}
public static void main(String[] args) {
SpringApplication.run(MiaoshaSystemApplication.class, args);
}
}
通过继承WebMvcConfigurationSupport 类重写addResourceHandlers方法让他去找那些默认的html,css,js文件即可。
7.mybatis中使用注解@Selectde进行list或者关联表查询的时候,出现了all elements are null,或者是查到了数据,但是数据项有些为null,有些数据显示不对的问题。后来才发现在配置中少了mybatis.configuration.map-underscore-to-camel-case=true。这个配置用于自动转换驼峰标识,在自定义了bean接受查询字段的时候,没有配置这个就会转换失败。
8.项目中的thymeleaf的url路径中,关于href跳转了新的url中,要注意 “ / ” 的问题,加了“ / ”代表从项目根目录开始,是绝对路径。没加代表的是相对路径。
例如:
<a th:href="'/goods/to_detail/'+${goods.id}">
浏览器显示的是:http://localhost:8080/goods/to_detail/21,
<a th:href="'goods/to_detail/'+${goods.id}">
浏览器显示的是:http://localhost:8080/goods/goods/to_detail/21
因为当前处于goods路径中,不加“ / ”代表从这一级别开始算起。
9.**问题描述:**当采用redis进行缓存页面的时候,发现原先静态页面的字符在浏览器上显示的类似于"???"的符号,而通过接口请求过来的数据能正常显示。
**解决方案:**后来发现在@RequestMapping()中增加属性:
produces = “text/html;charset=utf-8”,问题解决。
10.**问题描述:**使用事务的@Transactional的时候发现发生异常或者其他情况不能全部执行,spring不会自动回滚,mysql中的实际上应该回滚掉的数据也存在。
解决方案: mysql默认引擎是MyISAM ,不支持数据,需要将mysql表默认改为InnoDb安全事务的引擎。步骤如下:
更改 Mysql 默认引擎为 InnoDB步骤如下:
Mysql默认是关闭InnoDB存储引擎的使用的,将InnoDB设置为默认的引擎如下。
查看Mysql存储引擎情况: mysql>show engines InnoDB | YES,说明此Mysql数据库服务器支持InnoDB引擎。
设置InnoDB为默认引擎:在配置文件my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB
重启Mysql服务器
登录Mysql数据库,mysql>show engines 如果出现 InnoDB |DEFAULT,则表示设置InnoDB为默认引擎成功。