汪建军的博客

休迅飞凫,飘忽若神,凌波微步,罗袜生尘。

Android developer, sometimes thinking, sometimes try it.


Spring Boot(一)入门

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。简单来说SpringBoot整合了一系列成熟的框架并提供非常简易的开发方式,利用java注解的方式可以用少量且清晰的代码写出一个微服务系统。

快速上手

开发环境

IntelliJ IDEA:2017.1.4
springBoot:1.5.4
gradle:3.4.1

使用IntelliJ IDEA新建工程以及基础配置,在我之前的博客有写过,虽然是一年前的版本但是没有太大的差别。这里有两种构建项目的方式,Maven、 Gradle。我一直用android studio开发android,自然对gradle比较有亲切感,gralde使用起来也比较简洁,不像maven需要写大量的xml配置。

实现一个简单的RESTful API

1、新建一个工程,依次选择Gradle project、jar,勾上Web即可。

2、工程结构差不多是这样


3、build.gradle差不多这样
每次修改了build.gradle的内容,idea会自动rebuild


4、新建一个XXXApplication类

import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

这个类用SpringBootApplication注解,相当于入口,一些全局配置可以写在这里,如初始化sentry。


5、新建一个XXXController类

@RestController
@RequestMapping(produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
public class DemoController {

    @RequestMapping("/hello")
    public String hello() {
        return "hello spring boot!";
    }

}

@RestController注解类表示这个类所写的api都是以json格式返回,相当于省略了之前的@ResponseBody注解。
@RequestMapping1、在类名上注解:相当于这个Controller的全局缺省配置,如这里定义了method = RequestMethod.POST,接下来这个类下的api方法如果不指定method则都是post请求。2、在方法上注解,为该api单独配置,上面的"/hello"(或者写成value = "/hello"path = "/hello"都是一样的)是api的url。


6、运行,右键DemoApplication类run即可:
启动后在浏览器输入http://localhost:8080/hello 即可看到输出的"hello spring boot!"字符串。

两个类,十几行代码即可实现一个restful api,运行也不需要tomcat,像运行普通的java类一样,有没有特别简单,这是因为springboot默认带了一个嵌入式tomcat,从main启动有一个需要注意的地方,具体看这里
springboot语法糖越来越简单,省略了之前很多脚手架工作,更易上手,代码更清晰,让人更专注业务,但是也有缺点,就是底层越来越不知道怎么搞了(对于绝大多数人来说这个不重要)。

进阶

Api方法的参数说明

首先举个例子:

    @RequestMapping("/api/and")
    public MResult and(@RequestHeader HttpHeaders headers
            , @RequestParam("abc") int e
            , int b
            , @RequestParam(required = false) List<String> ss
            , @RequestParam(required = false) int i
            , @RequestParam(required = false) String s) {
        MResult mResult = MUtil.newSimpleOkResult(e + b);
        if (headers.containsKey("h1")) {
            String h1 = headers.get("h1").get(0);
            mResult.setMsg("h1=" + h1);
        }
        return mResult;
    }

这个api的功能是将传入的e、b两个参数相加,然后返回标准的固定格式json串,这很常见,很多公司的api返回的json格式都有一个固定的框架(即这里的MResult类),包含如code、errormsg之类。


1、@RequestHeader 表示这个api可以接收请求header,并通过headers.get(key).get(0);获得某一个key的value。

2、@RequestParam有两个配置:

  • value表示指定传入字段名,如果不指定,则与参数名一致,如参数"e"在请求传入的字段名就必须为"abc",参数"b"请求传入的字段名为"b"即可。
  • required表示该字段是否为必传,默认为必传,这里有一个坑,就是如果类型是int,你指定required = false,如果不传的话会报

    Optional int parameter 'i' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.

    所以最好不是必传的类型都为String。

3、List<String> ss在传入的时候这样写即可:

a,b,c,d

统一报错处理

新建一个类

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public MResult ExceptionHandler(Exception e, HttpServletRequest request, HttpServletResponse response) throws Exception {
        return new MResult(e.getMessage(), "fail", false, HttpStatus.BAD_REQUEST.value(), null);
    }

}

不需要其他配置,即可保证所有api报错返回固定格式。

最近的文章

Spring Boot(二)配置、单元测试、打包

配置 配置文件为application.properties,这个在我之前的博客有写过,这里补充几点: 1、添加spring.profiles.active=dev字段,在任意类里可以通过如下注解取出…

后端继续阅读
更早的文章

Android下实现身份证正面信息OCR

想要在Android下实现身份证正面信息的OCR,主要的思路就是: 先把照片上身份证的信息逐条切割出来,再用opencv的方法处理一遍,最后利用tess-two的库在异步线程里逐条识别。 关于te…

杂技继续阅读
comments powered by Disqus