五分钟搭建一个企业级web项目
前言
使用官方springboot-starter和第三方脚手架工具hunter-spring-boot-starter,
快速构建项目,在五分钟内即可进行业务开发。
一、使用官方starter快速搭建一个项目
使用IDEA spring initializr 新建一个spring项目
填写一些基本信息
group: 组织,一般是域名倒写
artifact:项目
添加web支持
配置文件改名
在resource目录下默认生成的配置文件是application.properties,把他改成 application.yml运行
在项目下有一个唯一的java类,运行这个main方法即可。- 访问
浏览器访问http://localhost:8080/
出现404项目运行成功
二、使用第三方starter完善
springboot已经大量简化了xml配置,但如果想进入业务的开发,还有些许配置要做,还要引入一些必备的工具类等,因此在springboot的基础上,hunter-spring-boot-starter又做了一些提供了一些常用工具和自动装配,使你马上进入业务开发阶段。
具体查看详细文档
- 项目功能:
- 通用返回类Result
- 全局异常处理
- Jackson工具类
- StringUtil工具
- Redis工具类
- RestTemplate工具类
- 线程池自动装配
- swagger 自动装配
- DefaultWebMVC注解
- 包含的依赖
- Apache common-lang3
- common-lang
- lombok
- OKhttp
在pom引入jar包
<dependency>
<groupId>com.github.gxhunter</groupId>
<artifactId>hunter-spring-boot-starter</artifactId>
<version>0.5</version>
</dependency>
使用内置的通用返回类Result
在企业后端开发中,Controller一般有一个通用类result,
hunter-spring-boot-starter提供了一个通用返回类实践,所有的Controller都使用这个类作为返回值。
示例Controller
@RestController
public class IndexController{
@GetMapping("index")
public Result index(){
return Result.success("请求首页成功");
}
}
使用postman调用接口
Result字段描述
字段 | 类型 | 描述 |
---|---|---|
status | int | 状态码 |
message | string | 返回信息 |
data | T | 携带数据 |
success | boolean | 是否成功 |
静态方法
除了上述的Result.success(Obj)用于返回成功,并携带Obj数据,Result还提供了其他的静态方法
方法名称
描述
success(T data)
成功并返回数据
success()
成功不携带数据
successMsg(String msg)
成功并返回信息
failed(String str)
失败,并提示信息,code使用默认
failed(T data,IErrorCode code)
失败,携带数据和提示信息和code
failed(T data,String message)
失败,并携带数据和提示信息
failed()
失败,不携带信息
方法名称 | 描述 |
---|---|
success(T data) | 成功并返回数据 |
success() | 成功不携带数据 |
successMsg(String msg) | 成功并返回信息 |
failed(String str) | 失败,并提示信息,code使用默认 |
failed(T data,IErrorCode code) | 失败,携带数据和提示信息和code |
failed(T data,String message) | 失败,并携带数据和提示信息 |
failed() | 失败,不携带信息 |
返回码对照表
遵循COC原则,内置了几个返回码枚举,你也可以实现IResponseCode.java
自定义扩展
内置的返回码枚举在com.github.gxhunter.enums.ResultEnum
返回码 | 描述 |
---|---|
0 | 成功 |
1 | 查询不到任何内容 |
2 | 新建失败 |
3 | 修改失败 |
4 | 删除失败 |
1000 | 操作失败(一般是抛出服务端手段throw ApiException) |
1001 | 参数校验失败 |
1999 | 网络超时(上述之外的其他异常) |
使用内置的异常处理器
无需任何配置,默认开启了异常处理器,分类捕获了ApiException、MethodArgumentNotValidException、Exception三种异常(可自行扩展)
查看如下实例代码
@PostMapping("/error")
public void error(){
int a = 1/0;
}
@PostMapping("/apierror")
public void apiError(){
// 模拟数据库操作失败
throw new ApiException("数据关联失败");
}
- 请求 /error 接口,抛出的异常没做分类处理,返回status为1999,提示信息是网超时
- 请求 /apierror 抛出的异常是ApiException,在异常处理器有做分类,返回结果如下
- 参数校验失败异常
如下一个实体类person,注解限制了name字段不能为null
@Data
public class Person{
@NotNull
private String name;
private long age;
}
对应Controller如下:
@PutMapping("/verify")
public Result<Person> verifyPerson(@RequestBody@Valid Person person){
return Result.success(person);
}
@Valid表示开启校验,这个注解必须要加
前端传入的name字段为空时,返回:
swagger支持
前面使用的postman,能够调用实现restfulapi的调用,但是这样每次都要自己填写url和参数实属麻烦,为此,本starter也实现了swagger2的自动装配。
- 引入swagger2包
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
在application.yml配置基本信息
有两个必配项,其他为选配项。
必配项: 1.enabled是否开启swagger 2.base-package 扫描的包(一般配Controller所在包路径即可)
访问swagger
重启项目,访问http://localhost:8080/swagger-ui.html
显示如下界面,swagger就配置成功啦。
@DefaultWebMVC注解
默认情况下,java序列化过程有许多坑,这个注解就是为解决这些坑而生。
场景
有如下一个类
@Data
public class Person{
private long id;
@NotNull
private String name;
private long age;
private Date birthday;
private LocalDateTime registerTime;
}
在Controller中,新增一个接口
@GetMapping("/getPerson")
public Result getPerson(){
Person person = new Person();
person.setId(12345678912233L);
person.setBirthday(new Date());
person.setRegisterTime(LocalDateTime.now());
return Result.success(person);
}
结果前端请求到的数据如下
有几个问题
- 接收到id与后端传过来的不一样,这是long类型精度丢失
- 时间格式不友好
解决方案
在启动类加上@DefaultWebMVC,无需其他操作,
此时再请求上述接口,返回的数据为:
@DefaultWebMVC注解功能总结:
- json时间格式化 为yyyy-MM-dd HH:mm:ss
- 时区指定为GMT+8
- long类型自动序列化为字符串,解决精度丢失问题。
- 其他在GitHub上查看详细文档
三、其他
到此项目初始化已经完成,可马上进入业务开发了,还有内置其他工具,如
JsonUtil、线程池、redisUtil、RestUtil、ftpUtil、StringUtil
这里就不再赘述,有兴趣可以查看详细文档