# common-mvc-parent
**Repository Path**: shengunkj/common-mvc-parent
## Basic Information
- **Project Name**: common-mvc-parent
- **Description**: No description available
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: spring-boot
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 5
- **Created**: 2021-01-22
- **Last Updated**: 2023-03-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# common-mvc-parent
## 动态环境打包
```
# 开发环境打包
mvn clean install -Dmaven.test.skip=true -Pdev
# 系统测试环境打包
mvn clean install -Dmaven.test.skip=true -Psit
# 生产环境打包
mvn clean install -Dmaven.test.skip=true -Pprod
```
### 发布 release 流程
可以通过 jitpack.io 依赖任何开源仓库的 release 版本
```
# 预发布环境准备,将代码推送到 github , 失败后可重新执行
mvn release:prepare -Dresume=false -X
# 回滚预发布环境
mvn release:rollback -X
```
## 清除 .iml 文件
```
# 直接运行只要一个 % 定义变量,bat 文件运行需要两个 %% 定义变量
for /r ./ %f in (*.iml) do del /a /f "%f"
# linux
find ./ -name \*.iml | xargs rm -rf
```
### 初始化流程
```
# 源码下载地址,以下地址2选1
git clone https://github.com/x403368945/common-utils.git
git clone https://gitee.com/xcc/common-mvc-parent.git
cd common-mvc-parent/
mvn clean compile # 编译时会生成 QueryDSL 查询实体
全局替换 common-mvc-parent 为 ?
全局替换 com.ccx.parent 为 com.?.?
全局修改包名 com.ccx.demo 为 com.?.?
全局替换 ccx.demo 为 ?.?
修改数据库名称 demo_main_db 为 ?_db
重命名 app-demo 为 app-?
修改 bootstrap.yml
spring.application.name: app->?
删除 .iml
find ./ -name \*.iml | xargs rm -rf & rm -rf .idea
```
* common-support[jar]:spring mvc 基础配置封装
* app-demo[jar]:应用组装部署模块,将所有需要发布的模块组装之后打成 war 包,作为单体应用发布,避免循环依赖打包报错
* main-module[jar]:应用入口【主模块】
* demo-service[jar]:参考案例【依赖于主模块】
### 注解说明
JPA 注解
|注解|位置|说明|
|---|:---:|---|
|@Table|类|注解映射数据库表名|
|-|-|name = "数据库表名"|
|-|-|uniqueConstraints = {@UniqueConstraint(columnNames = "uuid")}|
|@Entity|类|声明数据库映射实体类,将会被Spring JPA扫描|
|@DynamicInsert|类|声明,编译生成 insert 语句时,当字段为 null ,则被忽略|
|@DynamicUpdate|类|声明,编译生成 update 语句时,当字段为 null ,则被忽略|
|-|-|这里有坑,当数据库字段有值,希望把数据库字段设置为 null,这种情况需要使用其他解决方案;|
|-|-|方案1:数据库设置时,数字默认 0,字符串默认 '' ;需要置空时,实体类设置属性为默认的 0 和 '';|
|-|-|-- 优点:代码量少逻辑简单;|
|-|-|-- 缺点:JPA 只支持 ID 字段作为更新条件|
|-|-|方案2【推荐】:代码构建需要更新的字段,因为数据库有些字段可能不适合设置默认值|
|-|-|-- 优点:更灵活,场景可适配;大部分场景下,只有ID作为更新匹配条件无法满足需求|
|-|-|-- 缺点:代码量增加|
|@Transient|属性|@javax.persistence.Transient:spring-data jpa hibernate 声明 JPA + Hibernate 不与数据库建立映射,且 insert 和 update 忽略该属性|
|@Column|属性|声明实体与数据库字段映射,如果实体属性未指定该注解,则使用 spring.jpa.hibernate.naming.physical-strategy 配置的策略,所以如果实体添加扩展属性,不需要与数据库映射时,一定要加上 @Transient 注解;@Column(insertable = false, updatable = false)|
|-|-| name = "数据库字段名"|
|-|-| insertable = {true,false}, 声明数据库 insert 时是否强制忽略(不论是否有值),默认 true,为 false 则强制忽略|
|-|-| updatable = {true,false}, 声明数据库 update 时是否强制忽略(不论是否有值),默认 true,为 false 则强制忽略|
|@Id|属性|@javax.persistence.Id:注解声明 jpa hibernate 实体ID|
|@Modifying|方法|声明更新方法|
|@Query|方法|声明查询方法|
|-|-|value="HQL",支持原生SQL,但需要加上 nativeQuery=true|
|-|-|nativeQuery=true, 声明 value 上的语句为原生 SQL|
|@GeneratedValue|属性|声明 ID 生成策略|
|-|-|@GeneratedValue(strategy = GenerationType.IDENTITY); 使用数据库自增主键|
|-|-|@GeneratedValue(generator = "uuid32");自定义 ID 生成策略,必须要指定 @GenericGenerator|
|@GenericGenerator|属性|自定义 ID 生成策略,@GenericGenerator(name = "uuid32", strategy = "com.support.util.UUID32Generator")|
|@EnableJpaAuditing|类|JPA 审核模式开关,开启之后实体类加上 @EntityListeners(AuditingEntityListener.class) 之后 @CreatedDate,@LastModifiedDate 才会生效|
|@EntityListeners|类|声明该实体操作数据库时将会被 JPA 审核; @EntityListeners(AuditingEntityListener.class),必须先开启 @EnableJpaAuditing|
|@CreatedDate|属性|新增数据时,JPA 自动注入当前时间到该属性|
|@LastModifiedDate|属性|更新数据时,JPA 自动注入当前时间到该属性|
|@Enumerated|属性|声明枚举映射策略;@Enumerated(EnumType.STRING)|
|@Procedure|方法|声明存储过程调用|
|@NoRepositoryBean|类|声明 JPA 扫描时忽略该 Repository |
|@UniqueConstraint|注解|声明唯一索引,@UniqueConstraint(columnNames = "uuid")|
JPA Mongo 注解
|注解|位置|说明|
|---|:---:|---|
|@EnableMongoAuditing|类|JPA 审核模式开关,开启之后实体类加上 @EntityListeners(AuditingEntityListener.class) 之后 @CreatedDate,@LastModifiedDate 才会生效|
|@Document|类|声明 MongoDB 映射实体类,将会被Spring Mongo扫描|
|@Id|属性|@org.springframework.data.annotation.Id:注解声明 mongodb 实体ID|
|@Transient|属性|@org.springframework.data.annotation.Transient:spring-data mongodb 声明 JPA + Mongo 不与数据库建立映射,且 insert 和 update 忽略该属性|
|@Indexed|属性|@org.springframework.data.mongodb.core.index.Indexed:声明 mongodb 数据库生成索引|
|@Convert|属性|声明数据库和实体映射需要使用转换器,@Convert(converter = JsonObjectConvert.class)|
|@EntityListeners|类|声明该实体操作数据库时将会被 JPA 审核; @EntityListeners(AuditingEntityListener.class),必须先开启 @EnableJpaAuditing|
|@CreatedDate|属性|新增数据时,JPA 自动注入当前时间到该属性|
|@LastModifiedDate|属性|更新数据时,JPA 自动注入当前时间到该属性|
|@Enumerated|属性|声明枚举映射策略;@Enumerated(EnumType.STRING)|
QueryDSL 注解
|注解|位置|说明|
|---|:---:|---|
|@QueryEntity|类|声明 QueryDSL 实体类,将会被 QueryDSL 通用查询框架扫描,生成Q{ClassName}.java|
|@QueryTransient|属性|声明生成 Q{ClassName}.java 时忽略该属性|
|-|-|非数据库字段属性必须加上该注解,也就是实体上只要有 @Transient 地方一定要有 @QueryTransient|
|@QueryType|属性|声明查询类型,一般用于数据库使用 JSON 类型时,实体是用对象接收,查询时必须指定 @QueryType(PropertyType.STRING) |
lombok 注解
|注解|位置|说明|
|---|:---:|---|
|@NoArgsConstructor|类|生成无参构造函数|
|@AllArgsConstructor|类|生成全参构造函数|
|@RequiredArgsConstructor|类|生成 final 修饰字段或者是以 @Nonnull 声明字段的静态构造函数,函数名为 of ;前提是类不能有以下注解 @NoArgsConstructor,@AllArgsConstructor|
|-|-|staticName = "of" 声明静态构造函数方法名|
|@EqualsAndHashCode|类|生成类的 hash 码|
|-|-|callSuper = {true,false},声明 hash 是否携带父类属性,建议子类必须添加 @EqualsAndHashCode(callSuper = true)|
|@ToString|类|生成 toString 方法|
|-|-|callSuper = {true,false},声明 toString 是否携带父类属性,建议子类必须添加 @ToString(callSuper = true)|
|@Builder|类|生成链式类构造器,不支持父类继承属性|
|@Data|类|生成 get & set & toString & hashCode & equals 方法,子类必须添加 @EqualsAndHashCode(callSuper = true) 和 @ToString(callSuper = true)|
|@Accessors|类|声明 @Data & @Setter 生成 set 方法时的规则|
|-|-|chain = {true,false},为 true 时声明 set 方法返回当前类,便于链式调用|
|-|-|-- 这里有坑,使用 QueryDSL 框架的 Projections.bean 时,因为 set 方法都带返回值,所以出现检测不到 set 方法|
|-|-|-- 所以不建议在数据库映射的实体类中使用该注解;下面是采坑后的测试代码|
|-|-|-- Stream.of(Introspector.getBeanInfo(Item.class).getPropertyDescriptors()).forEach(prop -> System.out.println(String.format("%s :----> %s", prop.getWriteMethod(), prop.getReadMethod())));|
|-|-|fluent = {true,false}, 声明 @Data & @Setter & @Getter 注解生成 get & set 方法时不要 get & set 前缀|
|@Slf4j|类|注解生成 log 属性,可在类中通过 log.{debug,info} 输出日志|
|@Synchronized|方法|给方法加上同步锁|
|@SneakyThrows|方法|声明自动抛异常,不需要 在方法上加 throw {Exception,NullPointException,IOException}|
|@Setter|类|声明该类的所有属性只生成 set 方法|
|-|属性|声明该属性只生成 set 方法|
|@Getter|类|声明该类的所有属性只生成 get 方法|
|-|属性|声明该属性只生成 get 方法|
|@Cleanup|局部变量|用于方法执行完成之后调用局部变量特定的方法,一般用于关闭文件流|
|-|-|@Cleanup("指定调用的方法");默认执行 close 方法|
fastjson 注解
|注解|位置|说明|
|---|:---:|---|
|@QueryEntity|类|声明 QueryDSL 实体类,将会被 QueryDSL 通用查询框架扫描,生成Q{ClassName}.java|
|@JSONType|类|声明实体类属性序列化和反序列化规则|
|-|-|naming=PropertyNamingStrategy.{CamelCase,PascalCase,SnakeCase,KebabCase},声明类序列化和反序列化命名规则,默认为 CamelCase|
|-|-|orders={"属性名"},声明类序列化时属性的排序|
|-|-|includes={"属性名"},声明类序列化包含的属性,配置该属性之后,只序列化数组中包含的属性|
|-|-|ignores={"属性名"},声明类序列化忽略的属性,与 includes 相反|
|-|-|serialzeFeatures=SerializerFeature.{},声明类序列化策略,默认会返回 get 方法当做属性返回(例:getUser() 会当作 user 属性返回),可通过 SerializerFeature.IgnoreNonFieldGetter 忽略前面例子的规则|
|-|-|parseFeatures=Feature.{},声明类反序列化策略|
|@JSONField|属性|声明属性序列化和反序列化规则,支持加在 get 方法头上|
|-|-|serialize = {true,false},false:序列化时忽略该该属性,默认为 true|
|-|-|deserialize = {true,false},false:反序列化时忽略该该属性,默认为 true|
|-|-|fromat = "yyyy-MM-dd HH:mm:ss" 声明日期序列化和反序列化格式|
|-|-|serialzeFeatures = {SerializerFeature.UseISO8601DateFormat},声明属性序列化策略|
|-|-|parseFeatures = {Feature.AllowISO8601DateFormat},声明属性反序列化策略|
validator 注解
|注解|位置|说明|
|---|:---:|---|
|@Valid|属性|声明实体类参数参与校验;实体类的泛型集合可以通过该注解声明级联校验|
|-|-|private @Valid Entity entity; 声明校验 entity 内部属性|
|-|-|method(@Valid Entity entity); 声明校验 entity 内部属性|
|-|-|method(List<@Valid Entity> entities); 声明校验集合中每个 entity 内部属性|
|@Validated|类|声明该 bean 开启注解校验,该 bean 所有方法中带有 @Valid @Min @Max 等注解的参数参与校验|
|-|-|方法注解验证需要显式声明开启:@Bean public MethodValidationPostProcessor methodValidationPostProcessor() {return new MethodValidationPostProcessor();}|
|-|方法|@Validated(groups={ISave.class}):注解在方法参数的 @Valid 前面,可以指定 @Valid 标记的实体将会采用分组校验,只校验实体中该分组标记的字段;|
|-|-|测试发现在该注解在参数上不起作用,只能在方法头部指定分组才有效;但是方法头部@Validated(groups={Default.calss,ISave.class}), 必须加上Default.calss,否则方法参数上的校验注解必须加上ISave.class才会起作用|
|@Null|属性|属性必须是 null|
|-|参数|方法参数必须是 null|
|@NotNull|属性|属性不能为 null|
|-|参数|方法参数不能为 null|
|@NotBlank|属性|属性不能为 null 或 "" ,用于String类型|
|-|参数|方法参数不能为 null 或 "" ,用于String类型|
|@NotEmpty|属性|集合不能为null或empty,用于List集合|
|-|参数|集合不能为null或empty,用于List集合|
|@Size|属性|字符串最大长度和最小长度,集合元素数量。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|字符串最大长度和最小长度,集合元素数量。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@Pattern|属性|字符串正则校验。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|字符串正则校验。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@Min|属性|数字最小值。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|数字最小值。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@Max|属性|数字最大值。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|数字最大值。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@DecimalMin|属性|数字最小值,BigDecimal。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|数字最小值,BigDecimal。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@DecimalMax|属性|数字最大值,BigDecimal。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|数字最大值,BigDecimal。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@Digits|属性|浮点数字,整数位和小数位长度。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|浮点数字,整数位和小数位长度。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@Negative|属性|必须是负数。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|必须是负数。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@NegativeOrZero|属性|必须是0或负数。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|必须是0或负数。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@Positive|属性|必须是正数。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|必须是正数。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@PositiveOrZero|属性|必须是0或正数。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|必须是0或正数。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@AssertTrue|属性|Boolean值必须为true。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|Boolean值必须为true。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@AssertFalse|属性|Boolean值必须为false。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|Boolean值必须为false。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@Email|属性|验证邮箱格式。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|验证邮箱格式。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@Past|属性|过去的时间:必须小于当前时间。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|过去的时间:必须小于当前时间。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|@Future|属性|未来的时间:必须大于当前时间。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
|-|参数|未来的时间:必须大于当前时间。 值为 null 时不会校验,如果需要校验 null 值,需要配合 @NotNull|
Spring 注解
|注解|位置|说明|
|---|:---:|---|
|@SpringBootApplication|类|声明 spring-boot 启动类|
|@Configuration|类|声明 spring-boot 启动自动装载配置|
|@AutoConfigureAfter|类|指定配置文件在指定的配置之后初始化|
|@Import|类|导入其他不带 @Configuration 且需要启动装载的配置|
|@EnableConfigurationProperties|类|自动加载配置文件开关|
|@EnableAspectJAutoProxy|类|AspectJ 开关|
|@EnableWebMvc|类|MVC 配置开关|
|@ConfigurationProperties|类|装载配置文件到实体类,实体类头部必须添加 @Component 注解,且必须打开 @EnableConfigurationProperties。 @ConfigurationProperties("app") app 前缀的配置都装载到该实体|
|@EnableTransactionManagement|类|事务注解开关|
|@EnableJpaRepositories|类|JPA 开关|
|@PersistenceContext|属性|声明 spring 注入 EntityManager|
|@Primary|类|声明 bean 的优先级比其他实现者高,在不指定特定的实现者时,优先使用该 bean|
|@Order|类|控制 @Configuration 配置类 或 bean 加载顺序|
|@WebFilter|类|声明过滤器及拦截规则|
|@Nullable|参数|声明方法参数允许传递空值|
|@ControllerAdvice|类|声明需要全局异常拦截|
|@ExceptionHandler|方法|声明全局拦截指定异常;@ExceptionHandler(value = {IllegalArgumentException.class})|
|@PropertySource|类|加载指定的配置文件;@PropertySource(value = "classpath:service.properties", encoding = "UTF-8")|
|@Value|属性|获取配置文件数据,@Value("${spring.app.env}")|
|@ComponentScan|类|指定扫描包路径;@ComponentScan(basePackages = {"com.ccx"})|
|@EnableScheduling|类|定时任务开关|
|@Scheduled|方法|定时任务表达式|
|@Bean|方法|声明方法的返回值由 spring 管理生命周期|
|-|-|value="指定 bean 的名字",不指定则使用默认的命名规则|
|-|-|destroyMethod = "方法名"; 制定 bean 销毁时必须执行的方法;一般用于销毁线程池|
|@Component|类|声明类由 spring 初始化,由 spring 管理生命周期|
|@ConditionalOnProperty|类|控制该 bean 初始化条件,@ConditionalOnProperty(value = "spring.app.auto-task.enabled", havingValue = "true")|
|@ConditionalOnMissingBean|类|控制该 bean 初始化条件,当服务中已存在 bean 时不初始化|
|@@ConditionalOnExpression|类|控制该 bean 初始化条件,@ConditionalOnExpression("'prod'.equals('${spring.app.env}')")|
|@Autowired|属性|声明 spring 注入 bean|
|@Resource|属性|声明 spring 注入 bean|
|@Aspect|类|声明 AOP 拦截|
|@Pointcut|方法|定义 AOP 拦截规则 @Pointcut("execution(* com.ccx.demo..*.controller..*.*(..))") public void point() {} |
|@Before|方法|声明 AOP 方法执行之前,@Before("point()")public void before(final JoinPoint joinPoint)|
|@After|方法|声明 AOP 方法执行之后返回之前,@After("point()")public void after(JoinPoint joinPoint)|
|@AfterReturning|方法|声明 AOP 方法返回之后,@AfterReturning("point()")public void afterReturn(JoinPoint joinPoint, Object result)|
|@Around|方法|声明 AOP 方法环绕,@Around("execution(* com.ccx.demo..*.service..*.find*(..))") public Object around(final ProceedingJoinPoint joinPoint)|
|@Transactional|方法|声明方法事务隔离级别和传播机制|
|-|类|声明类所有方法事务,优先级低于方法上的声明|
|@Controller|类|声明类与前端交互|
|@RestController|类|声明类与前端交互,简化 @Controller 注解,不再需要 @ResponseBody 注解声明响应,但使用了该注解之后,所有方法将不能再使用 HttpServletResponse 控制响应|
|@RequestMapping|类|声明所有方法请求路径和请求方式|
|-|方法|声明请求路径和请求方式,请求路径会拼接 @RequestMapping 声明的路径作为前缀|
|@GetMapping|方法|声明 GET 请求及请求路径,请求路径会拼接 @RequestMapping 声明的路径作为前缀|
|@ResponseBody|方法|声明由 spring 构造响应结果|
|@PathVariable|参数|声明 ULR 路径参数|
|@RequestParam|参数|声明接收 URL 查询参数|
|-|-|value="参数名";映射参数名|
|-|-|required={true,false};参数是否必须|
|-|-|defaultValue="";参数默认值|
|@PostMapping|方法|声明 POST 请及及请求路径,请求路径会拼接 @RequestMapping 声明的路径作为前缀|
|@PutMapping|方法|声明 PUT 请及及请求路径,请求路径会拼接 @RequestMapping 声明的路径作为前缀|
|@PatchMapping|方法|声明 PATCH 请及及请求路径,请求路径会拼接 @RequestMapping 声明的路径作为前缀|
|@DeleteMapping|方法|声明 DELETE 请及及请求路径,请求路径会拼接 @RequestMapping 声明的路径作为前缀|
|@RequestBody|参数|声明方法参数来自于 http body|
|@Service|类|声明服务类|
Spring Security 注解
|注解|位置|说明|
|---|:---:|---|
|@EnableWebSecurity|类|Security 开关|
|@EnableGlobalMethodSecurity|类|控制 @Secured,@PreAuthorize 是否生效的开关|
|-|-|securedEnabled = true;启用注解:@Secured;[@Secured("ROLE_USER"), @Secured("IS_AUTHENTICATED_ANONYMOUSLY")]|
|-|-|prePostEnabled = true;启用注解:@PreAuthorize;[@PreAuthorize("hasAuthority('ROLE_USER')"), @PreAuthorize("isAnonymous()"), @PreAuthorize("hasAnyAuthority('ROLE_ADMIN', 'ROLE_USER')")]|
|@PostAuthorize|类|声明该类所有方法需要经过自定义权限校验|
|-|方法|声明该方法需要经过自定义权限校验,@PostAuthorize("returnObject.username == principal.username or hasRole('ADMIN')")|
|@AuthenticationPrincipal|参数|获取当前上下文中监权成功的用户信息|
|@Secured|方法|方法权限认证规则,必须带 ROLE_ 前缀,且 GrantedAuthority 中的角色也必须带 ROLE_ 前缀,IS_AUTHENTICATED_ANONYMOUSLY 属于特殊权限,表示游客,没有回话的用户都会被赋予游客角色;@Secured("ROLE_USER")|
|@PreAuthorize|方法|方法权限认证规则,可以不带 ROLE_ 前缀,可以通过该注解实现权限指令,作为权限指令使用时,称谓不适合叫角色|
|-|-|@PreAuthorize("isAnonymous()");满足游客|
|-|-|@PreAuthorize("hasAuthority('ROLE_USER')");必须满足该角色|
|-|-|@PreAuthorize("hasAnyAuthority('ROLE_ADMIN', 'ROLE_USER')");满足其中一个角色|
Spring Cache 注解
|注解|位置|说明|
|---|:---:|---|
|@EnableCaching|类|缓存开关|
|@CacheEvict|方法|删除缓存;@CacheEvict(cacheNames = "", key = "#id")|
|-|-|cacheNames="缓存模块名"|
|-|-|key="#id",缓存 key 生成规则|
|@Cacheable|方法|缓存返回数据;@Cacheable(cacheNames = "", key = "#id")|
|-|-|cacheNames="缓存模块名"|
|-|-|key="#id",缓存 key 生成规则|
Swagger 注解
|注解|位置|说明|
|---|:---:|---|
|@EnableSwagger2|类|Swagger 开关|
|@EnableKnife4j|类|Swagger 增强开关|
|@ApiIgnore|方法|声明 Swagger 接描时忽略该接口|
|-|参数|声明 Swagger 扫描时忽略该参数|
|@ApiModel|类|声明 Swagger 扫描实体;@ApiModel(description = "用户")|
|@ApiModelProperty|属性|声明 Swagger 扫描实体属性;@ApiModelProperty(position = 1, value = "", example = "")|
|-|-|position = 序号|
|-|-|value = "字段说明"|
|-|-|example = "参考值"|
|-|-|hidden = {true,false},字段是否隐藏|
|@Api|类|声明 Swagger 扫描接口,@Api(tags = "用户")|
|@ApiSort|类|声明接口显示顺序|
|@ApiOperationSupport|方法|声明接口方法扩展;@ApiOperationSupport(order = 1, ignoreParameters = {""})|
|-|-|order = 1;方法显示顺序|
|-|-|ignoreParameters = {"忽略属性"};指定调用接口忽略参数|
|-|-|params = @DynamicParameters;动态参数声明,一般用于 Map 类型参数接收|
|@ApiOperation|方法|声明接口信息;@ApiOperation(value = "说明", tags = {"标签"})|
|@ApiParam|参数|声明接口参数说明,@ApiParam(required = true, value = "", example = "") |
|-|-|required = {true,false};是否必填|
|-|-|value = "";参数说明|
|-|-|example = "";参考值|
|@ApiImplicitParam|方法|声明参数信息;@ApiImplicitParam(name = "body", dataType = "TabUser", dataTypeClass = TabUser.class, required = true)|
|-|-|name = "body";参数名|
|-|-|dataType = "TabUser";参数数据类型|
|-|-|dataTypeClass = TabUser.class;参数数据类型实体|
|-|-|required = {true,false};是否必填|
|@DynamicParameters|类|声明参数对象;@DynamicParameters(name = "NameVO", properties = {@DynamicParameter(name = "参数名", value = "属性说明", example = "参考值", required = true, dataTypeClass = String.class)})|
|-|-|name = "NameVO",对象显示类名|
|-|-|properties={@DynamicParameter},对象属性集合|
|@DynamicParameter|注解|声明对象参数属性;@DynamicParameter(name = "", value = "", example = "", required = true, dataTypeClass = String.class),|
|-|-|name = " 参数名";|
|-|-|value = "参数说明";|
|-|-|example = "参考值";|
|-|-|required = {true,false};是否必填|
|-|-|dataTypeClass = String.class;参数数据类型|
自定义注解
|注解|位置|说明|
|---|:---:|---|
|@Master|类|强制方法使用主库|
|@ServiceAspect|类|声明该服务实现类将会拦截 save,saveAll,update 方法|
|-|-|id={true,false};save,saveAll 方法是否自动清空ID,update 方法是否自动设置参数中的 ID 到更新对象中|
|-|-|uuid={true,false};save,saveAll 方法是否自动设置 uuid|
|-|-|user={true,false};save,saveAll 方法是否自动设置用户 id 到 [createUserId,updateUserId] 字段,update 方法是否自动设置用户 id 到 updateUserId 字段|
|-|-|sync={true,false};该 service 是否为同步镜像服务;比如将 mysql 数据以镜像形式存储到其他数据库|
其他注解
|注解|位置|说明|
|---|:---:|---|
|@Deprecated|类|标记该类已废弃不再使用|
|-|属性|标记该属性已废弃不再使用|
|-|方法|标记该方法已废弃不再使用|
|@Documented|注解|声明注解|
|@Target|注解|声明注解支持位置|
|@Retention|注解|声明注解生命周期|