SpringBoot+maven多模块项目常用功能集锦,主要用于rest前后端分离项目,内容取自网络和自身经验,文中如有疏漏还请指正!
本项目SpringBoot版本为2.1.3.RELEASE
, 代码中会嵌入部分链接作为参考
- SpringBoot+maven多模块项目配置(入口启动类
demo.web.WebApplication
) - 拦截器的使用
HandlerInterceptorAdapter
- 统一异常处理
ControllerAdvice,ExceptionHandler
- controller层参数校验(json参数、键值对参数、单个参数)
Validated, Valid
- AOP记录日志
Aspect
- 跨域访问
- 文件上传(拦截器控制大小限制)
MultipartFile
- 邮件发送(结合JetBrick模板引擎)
- 异步任务(多线程)
EnableAsync, Async
- 计划任务(定时任务)
Scheduled
- 第三方接口调用
RestTemplate
- 常用配置(见application.properties)
- 随机验证码生成
VerifyCodeUtils
父pom.xml文件中
<groupId>demo</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>parent</name>
<!--必须指定为pom-->
<packaging>pom</packaging>
<!--指定子模块-->
<modules>
<module>web</module>
<module>service</module>
</modules>
子模块pom.xml中
<!--指定parent-->
<parent>
<groupId>demo</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--上面的三个可以直接copy父pom.xml中的内容-->
<relativePath>../pom.xml</relativePath>
</parent>
详见本项目代码
若入参是对象,则给该对象的类加上@Validated
, 注意@Valid
不要漏了,否则不会生效
/**
* 参数校验2,入参为json数据
* 异常类型:{@link org.springframework.web.bind.MethodArgumentNotValidException}
*/
@PostMapping("/param1")
public User param1(@Valid @RequestBody User user) {
return user;
}
@Validated
@Data
public class User {
private String id;//用户ID
@NotNull(message = "昵称不能为空")
@Size(min = 2, max = 64, message = "昵称长度必须在2-64个字符")
private String username;/
@Email(message = "邮箱必须合法")
@NotNull(message = "邮箱不能为空")
private String email;
}
如果User
类上没加@Validated
,在Controller类上加@Validated
,效果是一样的,建议两个地方都加上,因为针对单个参数的校验,必须在Controller上加 @Validated
@RestController
@Validated//校参注解
public class RestfulController {
//单个参数校验
@RequestMapping("/param2")
public Integer param2(@Range(min = 1, max = 100, message = "age必须在1和100之间") @RequestParam Integer age) {
return age;
}
}
具体情况还是亲自运行看看吧
文件上传大小限制为什么用拦截器实现呢?其实SpringBoot自带参数设置可以限制文件大小,如下:
# 上传文件单个最大值
spring.servlet.multipart.max-file-size=1MB
# 上传文件总最大值
spring.servlet.multipart.max-request-size=10MB
但是会有一个问题,就是当上传的文件大小超过限制时,会抛出MaxUploadSizeExceededException
异常,此异常无法被ControllerAdvice
捕获,故使用拦截器来判断,若你有什么更好建议,欢迎提出!
更多内容,持续更新,感谢支持!