- 升级原因
首先纠正以前一个错误认识:SpringMVC与SpringBoot没有半毛钱关系!
Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。Spring Boot只是承载者,辅助开发者简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和SpringMVC的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot。
Spring Boot引入自动配置的概念,让项目设置变得很容易。Spring Boot是一个简化Spring开发的框架。用来监护spring应用开发,约定大于配置,去繁就简,just run 就能创建一个独立的,产品级的应用。
其优点如下:
其核心特点包括但不限于
- ·微服务:
使用Spring Boot可以生成独立的微服务功能单元
- ·自动配置:
针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置
- ·起步依赖:
告诉Spring Boot需要什么功能,它就能引入需要的库。
- ·命令行界面:
这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建。
- ·Actuator:
让你能够深入运行中的Spring Boot应用程序。她是spring boot项目中非常强大的一个功能,有助于对应用程序进行监控和管理,通过restful api请求来监管、审计、收集应用的运行情况,针对微服务而言它是必不可少的一个环节。
综上所述,为让开发团队尽快切换到主流开发技术的航道,加速提升技术的脚步,有必要把项目mzdata的技术架构由SpringMVC升级SpringBoot。
2.升级步骤
2.1.Pom文件更新
升级核心操作是主要更新common-parent子项目pom.xml,作用升级SpringBoot专属jar包,其他jar基本可以不变。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<!—-此处略过其他引用JAR包-->
<!--springboot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!--<scope>provided</scope> 注意,这个scope需要被注释掉-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--迁移专用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
</dependency>
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- web socket -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!--springboot基本jar包结束 -->
2.2.约定优于配置
- 砍掉原项目/resources/spring文件夹以spring为前缀的xml文件:springmvc.xml、applicationContext-trans.xml、applicationContext-shiro.xml、applicationContext-service.xml、applicationContext-dao.xml。
其中applicationContext-shiro.xml内容其实已经被com.mzyp.service.shiro. ShiroConfig.java替换。
2.3.输出日志
为保障正常输出日志,在项目/resources/spring文件夹下添加logback-spring.xml,其内容如下:
<property resource="application.properties" />
<property name="log.root.level" value="${log.root.level}" />
<property name="log.path" value="${log.path}" />
<property name="log.moduleName" value="${log.module}" />
2.4.主配置文件
application.properties参见如下:
server.port=8080
server.servlet.context-path=/web
spring.mvc.view.prefix = /WEB-INF/views/
spring.mvc.view.suffix = .jsp
#静态文件访问配置
spring.mvc.static-path-pattern=/**
# 数据库访问配置
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://xxx.xxx.xxx.xxx:3306/mzdata?useUnicode=true&characterEncoding=utf8&autoReconnect=true
spring.datasource.username = xxx
spring.datasource.password = yyy
# 下面为连接池的补充设置,应用到上面所有数据源中
spring.datasource.initialSize = 5
spring.datasource.minIdle = 5
spring.datasource.maxActive = 20
# 配置获取连接等待超时的时间
spring.datasource.maxWait = 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis = 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis = 300000
spring.datasource.validationQuery = SELECT 1 FROM DUAL
spring.datasource.testWhileIdle = true
spring.datasource.testOnBorrow = false
spring.datasource.testOnReturn = false
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters = stat,wall,log4j
spring.datasource.logSlowSql = true
spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
log.path = /mzdataLog
log.root.level = INFO
log.module = mzdata
mybatis.mapper-locations = classpath*:com/mzyp/mapper/**/*.xml
mybatis.type-aliases-package = com.mzyp.model
mybatis.config-location = classpath:mybatis/SqlMapConfig.xml
2.5.主启动文件
package com.mzyp;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Description: 主启动文件
* @Author Yupeng
* @Date 2019/7/30 0030 16:12
* @Param
* @return
**/
@SpringBootApplication(scanBasePackages = {"com.mzyp"})
public class BootApplication {
public static void main(String[] args) {
//SpringApplication.run(Application.class, args);
SpringApplication application = new SpringApplication(BootApplication.class);
application.setBanner((environment, sourceClass, out) -> {
//这里打印一个自定义logo
System.out.println("......Tera Co.,Ltd......");
});
application.setBannerMode(Banner.Mode.CONSOLE);
//你还可以干其他的定制化初始设置
application.run(args);
}
}
本文件只能放到项目路径/src/main/java/com/mzyp文件夹下,否则无
法运行。
2.6.批量扫描
如果每一给mapper都添加@mapper注解会很麻烦,这时可以使用@MapperScan注解来批量扫描包。
参见如下:
/**
* 批量扫描Mybatis接口dao文件
*/
@Configuration
@MapperScan("com.mzyp.dao")
public class MapperLoader {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource(){
return new DruidDataSource();
}
}
2.7.删除无关引用jar包及工具类
2.7.1.包括但不限于javaee-api包 、freemaker包、SendMailUtil.java等
2.7.2.com.mzyp.supcan包BaseController.java、SupcanController.java
3.升级历史
3.1.异常UnavailableSecurityManagerException
故障:UnavailableSecurityManagerException: No SecurityManager accessible to the calling code
解决:参见2.2章节
3.2.静态文件404
故障:登录后,因CSS 、JS等静态文件路径有误,无法正常加载页面
解决:对资源路径进行配置,可以在 application.properties 配置文件中加入下面的配置spring.mvc.static-path-pattern=/**
3.3.异常NoSuchBeanDefinitionException
故障:Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mzyp.dao.shiro.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.annotation.Resource(shareable=true, lookup=, name=, description=, authenticationType=CONTAINER, type=class java.lang.Object, mappedName=)}
解决:主启动文件加注解:@SpringBootApplication(scanBasePackages = {"com.XX "})
3.4.异常UncategorizedSQLException
故障:2019-07-30 11:20:50.538 ERROR 7500 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/web] threw exception [Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException:
### Error querying database. Cause: java.sql.SQLException: sql injection violation, comment not allow : select
.........//其他SQL语
/*order by op.parent_permis_id,op.permis_order*/
### The error may exist in file [F:\myworks\mzdata-dao\target\classes\com\mzyp\mapper\shiro\PermisMapper.xml]
### The error may involve com.mzyp.dao.shiro.PermisMapper.selectByUserId
### The error occurred while executing a query
解决:去掉/*order by op.parent_permis_id,op.permis_order*/,建议在相关xxxMapper.xml去掉没用的内容,以免引起误伤。