记录自己将spring传统项目改造为springboot项目所遇到的问题..
问题1:启动时jar包找不到
原因:
tomcat在8.5.2 以后的版,修改了加载jar的方式,8.5.2 版本会解析jar中MANIFEST.MF文件,当该文件包含class-path属性时,会把该属性对象值,解析成需要加载的jar给加载进来。
解决办法:
将tomcat的版本降到8.0.29
<tomcat.version>8.0.29</tomcat.version>
问题2:持久层获取数据出错
原因:
Mybatis的jar包,3.4.1之后不再支持#{0}作为占位符,而是使用#{arg0}作为参数占位符。
解决:
将mybatis的jar包版本降为3.4.1版本
问题3:关于springboot 热部署问题
解决:网上说的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
像是一个热启动,每次保存就会重新启动项目,
热部署每次将会替换修改编译后的文件。
经查证: springboot官网说,对于idea使用ctrl+F9的方式可以实现热部署
也可以修改热键
问题4:springboot文件上传
使用以上形式始终拿不到文件对象
原因:
spring-boot自带的org.springframework.web.multipart.MultipartFile 和Multipart产生冲突,
如果同时使用了MultipartResolver 和ServletFileUpload,就会在iter.hasNext()返回false.然后整个循环就跳出去了。整个问题产生的原因是Spring框架先调用了MultipartResolver 来处理http multi-part的请求。这里http multipart的请求已经消耗掉。后面又交给ServletFileUpload ,那么ServletFileUpload就获取不到相应的multi-part请求。因此将multipartResolve配置去除,问题就解决了。
解决:取消关于上传文件的配置(两种方式都去掉)
问题5:ApplicationContextAware接口
Spring容器会检测容器中的所有Bean,如果发现某个Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,调用该方法时,会将容器本身作为参数传给该方法,该方法中的实现部分将Spring传入的参数(容器本身)赋给该类对象的applicationContext实例变量,因此接下来可以通过该applicationContext实例变量来访问容器本身。