SpringMVC项目升级SpringBoot项目参考

  1. 升级原因

首先纠正以前一个错误认识:SpringMVCSpringBoot没有半毛钱关系!

 

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 就能创建一个独立的,产品级的应用。

其优点如下:

https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=899973693,1238735383&fm=173&app=49&f=JPEG?w=485&h=202&s=1E8A762395C04CEA085DC0DB0100C0B0

其核心特点包括但不限于

  • ·微服务:

使用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去掉没用的内容,以免引起误伤。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值