Migrate spring project to spring-boot

基础背景

基于主流发展趋势向着基于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目录下即可.

结束

至此, 我的迁移工作已经全部结束, 本文断断续续的写了几天, 其实每个部分都有很多的知识点可以深入研究, 但目的是首先让它运行起来. 希望我记录的过程对你会有帮助.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值