基础背景
基于主流发展趋势向着基于spring-boot, 在其基础上开发配套的开箱即用项目, 和与其紧密结合的独立项目发展.且spring5已经出现了很长时间, 虽然SSM的经典搭配可以满足需求, 但决定要将个人的项目升级到spring-boot+spring5的搭配上.毕竟公司实在没有合适的让我下刀, 逃;)
调研
截至我写这篇博客, spring-boot最新的版本是2.2.0, 使用idea的Spring Initializr即可新建一个spring boot项目. 我在这里遇到了一个问题, 如果使用了spring-boot-start-web
这个包, 并继承了父文件的版本(即2.2.0), 那么由其引入的依赖:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.10.0</version> </dependency>
会下载失败, 即使下载成功, 在idea中解析的时候也会失败, 导致idea不能自动引入外部依赖jar包, 表现为项目的主启动类import语句报错, pom.xml文件也会有错误提示. 我在同事的电脑上也尝试了直接引入jackson-annotations
这个包的2.10.0
版本, 结果也报错不能下载. 目前我的解决方案是在spring-boot-start-web
中排除掉了jackson-annotations
的引用, 直接引用其上一个版本2.9.9
,如下:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.9</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </exclusion> </exclusions> </dependency>
为了方便, 我使用旧后台与新后台, 分别指代原使用SSM的项目与迁移后使用springboot的项目.
<!-- more -->
下手
整体迁移的核心路线是: 框架正常启动 -> web接口 -> 数据库访问 -> 整体业务部分 -> 静态页面文件
web接口部分
项目中有使用swagger作为api文档支持, 因此我先放弃了对自己编写的页面文件的移植, 通过swagger的页面来测试, 是否已经使web部分生效.
旧后台的 controller 层, 使用了 @controller
注解来标识类为一个controller, 并在方法的返回值上, 添加了 @ResponseBody
注解来返回json字符串. 在新项目中替换为@RestController
注解, 此注解为一个复合注解, 源码如下:
@Controller @ResponseBody public @interface RestController { @AliasFor( annotation = Controller.class ) String value() default ""; }
兼具了@Controller
与@ResponseBody
的作用.
整体swagger的测试controller代码如下:
@RestController @RequestMapping("/test") @Api(value = "testSwaggerController", description = "测试swagger2集成结果.") public class TestController { @RequestMapping("testMe") @ApiOperation(value = "测试接口", httpMethod = "POST", response = String.class, notes = "测试swagger2 api用.") public String test( @ApiParam(name = "name", type = "String", value = "访问者姓名") @RequestParam(value = "name", required = false) String name, HttpServletRequest request, HttpServletResponse response){ String _name = name == null ? "匿名者" : name; response.setContentType("text/plain;charset=UTF-8"); return "hello,Tester " + _name + ".I get your IP is:" + IP_util.getIpAddr(request); }}
旧项目使用的xml配置文件的方式, 定义了mvc静态资源, 以使swagger静态页面可以被访问. 在springboot中, 虽然可以通过引入xml配置文件的方式(通过@ImportResource
注解)达到同样的目的, 但我选择了另外一种基于java配置的方式.
此方法通过实现WebMvcConfigurer
接口, 重写addResourceHandlers
方法, 注册新的静态资源路径, 达到的效果是一样的.代码如下:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/statics/**").addResourceLocations("classpath:/statics/"); // 解决 SWAGGER 404报错 registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } }
swagger 的配置类如下:
@Configuration @EnableSwagger2 public class SwaggerConfiguration { @Bean public Docket api() { //swagger-ui 上的response content type 下拉选择, 填充上 image/jpeg之后, 可以支持对图片请求的模拟 return new Docket(DocumentationType.SWAGGER_2) .produces(Sets.newHashSet("*/*", "image/jpeg")) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("cn.codeh.blogbackground")) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("blog API") .description("blog API doc.") .termsOfServiceUrl("https://codeh.cn/") .version("1.0") .build(); } }
至此, swagger的重点配置已经完毕. 启动XApplication
类的main
方法, 在浏览器中访问http://127.0.0.1:8080/swagger-ui.html
, 即可看到熟悉的绿色界面了.
数据库访问部分
首先, 添加依赖.
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
由于我的项目之前使用的是xml编写的mappers文件, 因此就不再使用注解的方式改造了, 所幸通过xml的配置方式支持很好, 只需要少量的配置就可以使用.
在appcalition.yml
(就是你的springboot主要配置文件)中添加如下配置.
spring: datasource: url: 'jdbc:mysql://123.123.123.123:123/test?characterEncoding=utf-8' username: test password: '123456' driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mybatis/mappers/*.xml config-location: classpath:mybatis/config/mybatis-config.xml
如果是properties文件, 则需要扩展key至全称, 官方推荐使用yml, 我也就改了, 其实坑比较多, 例如密码如果是纯数字, 000会变成0, 因为yml中有类型. 选择自己习惯的即可.
如上配置后, 我复制所有的mapper文件到新项目中, 通过mapper-locations
指定位置. 主要配置文件通过config-location
指定.
在XAppcalition类中添加注解@MapperScan("xxx.xxx.xxx")
用以指定Mapper的interface文件路径.
如果使用idea, 那么在service中使用
@Autowired private Mapper mapper;
类似这样的自动注入时, 可能会报找不到类的问题, 解决方案是在interface文件中, 添加@Repository
注解. 当然不加的话项目也不会报错, 只是看到一条报错的红线, 总是不爽.
整体业务部分
这部分其实没什么好说的, controller和数据库部分都可以正常使用了, 剩下的只要按照之前的样子copy过去即可.
静态资源部分
springboot默认会将以下目录作为静态资源的放置路径:
classpath:/static classpath:/public classpath:/resources classpath:/META-INF/resources
因此, 我只需要将原有项目的webapps
目录下的文件悉数移动到static
目录下即可.
结束
至此, 我的迁移工作已经全部结束, 本文断断续续的写了几天, 其实每个部分都有很多的知识点可以深入研究, 但目的是首先让它运行起来. 希望我记录的过程对你会有帮助.