基础背景
基于主流发展趋势向着基于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目录下即可.
结束
至此, 我的迁移工作已经全部结束, 本文断断续续的写了几天, 其实每个部分都有很多的知识点可以深入研究, 但目的是首先让它运行起来. 希望我记录的过程对你会有帮助.
本文详述从SSM框架迁移到Spring Boot的过程,包括解决依赖冲突、配置swagger、整合MyBatis及数据库访问、处理静态资源等关键步骤。
480

被折叠的 条评论
为什么被折叠?



