接着上一篇文章App项目之服务基础篇,继续探讨我们App服务端的搭建与配置。今天的主题是配置,上一篇我们已经使用Spring boot搭建了一个Restful API的工程,那么在此基础上进行一些改进和配置。
返回参数的格式统一化
对于服务端参数的格式的统一化,有助于App端的解析,对于双方的接口调试能够达到事倍功半的效果。返回参数的格式我是这样设置的:每个Controller中的请求方法返回值都采用的是ResponseEntity这个Spring内部的实体类,
此外我还自己定义一个ApiResponse的实体类,包括code,msg,data,datas,timestamp这几个属性。
1 | public class ApiResponse<T> { |
另外,还定义了一个工具类ResponseUtil,便于处理返回实体的构建
1 | public class ResponseUtil { |
错误处理的统一配置
在日常开发中发生了异常,往往是需要通过一个统一的异常处理处理所有异常,来保证客户端能够收到友好的提示。
SpringBoot在页面 发生异常的时候会自动把请求转到/error,SpringBoot内置了一个BasicErrorController对异常进行统一的处理。
那么我们定义一个AppErrorController来处理异常。通常都会涉及到Html和Json请求,如果是Json请求则返回String或者ReponseEntity类型
,如果是Html请求,则返回ModelAndView的错误页面。
1 |
|
Redis的配置
对于Redis服务器的安装此处就不介绍了,默认我们已经安装了Redis。在build.gradle中添加
1 | compile 'org.springframework.boot:spring-boot-starter-data-redis:1.4.2.RELEASE' |
在application.properties文件中添加对redis的配置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0
如果在redis服务器中存储自定义的Bean的话,我们建一个RedisObjectSerializer继承自RedisSerializer的类
1 | public class RedisObjectSerializer implements RedisSerializer<Object> { |
Redis的配置类
1 |
|
分页查询的配置
分页查询,我使用的是MyBatis的一个插件PageHelper,其中上文中提到的PageInfo这个实体类就是在PagerHelper这个库中定义的,我们来看一下它的使用。
1 | compile 'com.github.pagehelper:pagehelper:4.1.6' |
在项目中创建一个PageHelperConfig类,对MyBatis分页插件进行配置
1 |
|
随后在Mapper中我们定义一个查询全部的方法,在Service中实现分页查询
1 | "select * from tb_user") ( |
1 |
|
这样我们就实现了分页查询,具体在Controller中返回的结果,我们看一下
1 | { |
文件上传
几乎所有的App项目中都会有文件图片上传的功能,有的是单文件上传,有的是批量上传,那我们看一下在Spring boot工程下实现的文件上传功能。
首先在application.properties 文件中添加服务器存储的路径
1
web.upload.file_path=/User/xxx/upload 具体服务器中的某一路径
新建一个FileUploadController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29"${web.upload.file_path}") (
private String uploadPath;
"imgs/upload",method = RequestMethod.POST) (value =
public ResponseEntity handleImagesUpload(@RequestParam("imgs") MultipartFile[] files){
ResponseEntity responseEntity=null;
int len;
if(files!=null&&(len=files.length)>0){
for(int i=0;i<len;i++) {
try {
String fileName = files[i].getOriginalFilename();
if (!TextUtils.isEmpty(fileName) && isImageFile(fileName)) {//判断文件名是否存在且是否为图片类型
//创建输出文件对象
File outFile = new File(uploadPath + File.separator +"imgs_"+ IceUtils.getUUID() + getFileType(fileName));
//拷贝文件到输出文件对象
FileUtils.copyInputStreamToFile(files[i].getInputStream(), outFile);
//上传成功,写数据库等操作
}
} catch (Exception e) {
logger.error("--FileUploadController--handleImagesUpload--", e);
}
}
responseEntity=ResponseUtil.success("上传成功");
}else{
responseEntity= ResponseUtil.custom("上传的文件为空或者文件类型不符",RESCODE_PARAM_ERROR);
}
return responseEntity;
}
Swagger2的配置,生成Restful API文档
Swagger2可以轻松的整合到Spring boot中,并与Spring MVC程序配合组织出强大RESTful API文档。
它既可以减少我们创建文档的工作量,同时说明内容又整合入实现代码中,让维护文档和修改代码整合为一体,
可以让我们在修改代码逻辑的同时方便的修改文档说明。另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API。
接下来看如何使用Swagger2,首先在build.gradle 中添加swagger的库
1 | //swagger生成restful api文档 |
在Apllication同目录下新建一个Swagger2的类:
1 |
|
如上代码所示,通过@Configuration注解,让Spring来加载该类配置。再通过@EnableSwagger2注解来启用Swagger2。
再通过createRestApi函数创建Docket的Bean之后,apiInfo()用来创建该Api的基本信息(这些基本信息会展现在文档页面中)。
select()函数返回一个ApiSelectorBuilder实例用来控制哪些接口暴露给Swagger来展现,本例采用指定扫描的包路径来定义,
Swagger会扫描该包下所有Controller定义的API,并产生文档内容(除了被@ApiIgnore指定的请求)。
添加文档内容
在完成了上述配置后,其实已经可以生产文档内容,但是这样的文档主要针对请求本身,而描述主要来源于函数等命名产生,对用户并不友好,
我们通常需要自己增加一些说明来丰富文档内容。如下所示,我们通过@ApiOperation注解来给API增加说明、通过@ApiImplicitParams、@ApiImplicitParam注解来给参数增加说明。
1 |
|
完成上述代码添加上,启动Spring Boot程序,访问:https://localhost:8080/swagger-ui.html, 就能看到前文所展示的RESTful API的页面。
写在最后
到此为止,对Spring boot工程中的一些基本配置就介绍完了。下一篇会介绍登录注册,及Token的创建及验证等和权限控制这部分内容。