Appearance
acuity-core类
说明
该模块定义项目中最核心、最常用的工具类、特殊Bean、自定义异常、自定义转换器等.
源码结构
[结构]
java
├── com
│ └── fasterxml
│ └── jackson
│ └── databind
│ └── deser
│ └── std
│ └── EnumDeserializer.java # 覆盖 jackson 官方EnumDeserializer
└── top
└── acuity
└── commons
├── base
│ ├── R.java # 全局统一返回
│ └── entity
│ ├── Entity.java # 公共实体父类
│ ├── SuperEntity.java
│ └── TreeEntity.java
├── constant
│ └── Constants.java # 常量类
├── context
│ ├── ContextConstants.java # 上下文常量
│ └── ContextUtil.java # 上下文工具类
├── converter
│ ├── BaseDateConverter.java # 日期转换器
│ ├── EnumSerializer.java # 枚举序列化处理器
│ ├── AcuityLocalDateTimeDeserializer.java # LocalDateTime 反序列化处理器
│ ├── String2DateConverter.java # 日期转换器
│ ├── String2LocalDateConverter.java
│ ├── String2LocalDateTimeConverter.java
│ └── String2LocalTimeConverter.java
├── exception # 自定义异常
│ ├── ArgumentException.java
│ ├── BaseCheckedException.java
│ ├── BaseException.java
│ ├── BaseUncheckedException.java
│ ├── BizException.java
│ ├── CommonException.java
│ ├── ForbiddenException.java
│ ├── UnauthorizedException.java
│ └── code
│ ├── BaseExceptionCode.java
│ └── ExceptionCode.java
├── function
│ ├── CheckedFunction.java
│ └── Either.java
├── interfaces # 常用接口
│ ├── BaseEnum.java
│ ├── echo
│ │ ├── EchoService.java
│ │ ├── EchoVO.java
│ │ └── LoadService.java
│ └── validator
│ └── IValidatable.java
├── jackson # json 工具类
│ ├── JsonUtil.java
│ └── AcuityJacksonModule.java
├── model
│ ├── Kv.java
│ ├── cache
│ │ ├── CacheHashKey.java
│ │ ├── CacheKey.java
│ │ └── CacheKeyBuilder.java
│ └── log
│ └── OptLogDTO.java
└── utils # 常用工具类
├── AntiSqlFilterUtils.java
├── ArgumentAssert.java
├── Arith.java
├── BeanPlusUtil.java
├── ClassUtils.java
├── CollHelper.java
├── DateUtils.java
├── DbPlusUtil.java
├── DefValueHelper.java
├── PingYinUtil.java
├── SpringUtils.java
├── StrHelper.java
├── StrPool.java
├── TreeUtil.java
└── ValidatorUtil.java
├── com
│ └── fasterxml
│ └── jackson
│ └── databind
│ └── deser
│ └── std
│ └── EnumDeserializer.java # 覆盖 jackson 官方EnumDeserializer
└── top
└── acuity
└── commons
├── base
│ ├── R.java # 全局统一返回
│ └── entity
│ ├── Entity.java # 公共实体父类
│ ├── SuperEntity.java
│ └── TreeEntity.java
├── constant
│ └── Constants.java # 常量类
├── context
│ ├── ContextConstants.java # 上下文常量
│ └── ContextUtil.java # 上下文工具类
├── converter
│ ├── BaseDateConverter.java # 日期转换器
│ ├── EnumSerializer.java # 枚举序列化处理器
│ ├── AcuityLocalDateTimeDeserializer.java # LocalDateTime 反序列化处理器
│ ├── String2DateConverter.java # 日期转换器
│ ├── String2LocalDateConverter.java
│ ├── String2LocalDateTimeConverter.java
│ └── String2LocalTimeConverter.java
├── exception # 自定义异常
│ ├── ArgumentException.java
│ ├── BaseCheckedException.java
│ ├── BaseException.java
│ ├── BaseUncheckedException.java
│ ├── BizException.java
│ ├── CommonException.java
│ ├── ForbiddenException.java
│ ├── UnauthorizedException.java
│ └── code
│ ├── BaseExceptionCode.java
│ └── ExceptionCode.java
├── function
│ ├── CheckedFunction.java
│ └── Either.java
├── interfaces # 常用接口
│ ├── BaseEnum.java
│ ├── echo
│ │ ├── EchoService.java
│ │ ├── EchoVO.java
│ │ └── LoadService.java
│ └── validator
│ └── IValidatable.java
├── jackson # json 工具类
│ ├── JsonUtil.java
│ └── AcuityJacksonModule.java
├── model
│ ├── Kv.java
│ ├── cache
│ │ ├── CacheHashKey.java
│ │ ├── CacheKey.java
│ │ └── CacheKeyBuilder.java
│ └── log
│ └── OptLogDTO.java
└── utils # 常用工具类
├── AntiSqlFilterUtils.java
├── ArgumentAssert.java
├── Arith.java
├── BeanPlusUtil.java
├── ClassUtils.java
├── CollHelper.java
├── DateUtils.java
├── DbPlusUtil.java
├── DefValueHelper.java
├── PingYinUtil.java
├── SpringUtils.java
├── StrHelper.java
├── StrPool.java
├── TreeUtil.java
└── ValidatorUtil.java
基础Bean
- R: 全局返回类. 定义了统一的返回格式
json
{
"code": 0, // 状态码 0表示请求成功 其他请求失败
"data": { // 业务数据
},
"errorMsg": "", //错误消息
"extra": {}, // 扩展数据
"isSuccess": true, // 是否请求成功
"msg": "", // 响应消息
"path": "", // 访问失败时的请求路径
"timestamp": 0 // 后端响应时的时间戳
}
{
"code": 0, // 状态码 0表示请求成功 其他请求失败
"data": { // 业务数据
},
"errorMsg": "", //错误消息
"extra": {}, // 扩展数据
"isSuccess": true, // 是否请求成功
"msg": "", // 响应消息
"path": "", // 访问失败时的请求路径
"timestamp": 0 // 后端响应时的时间戳
}
- SuperEntity: 超级父类, 继承它的表至少需要3个字段id、created_time、created_by
- Entity: 通用父类, 继承它的表至少需要5个字段id、created_time、created_by、updated_time、updated_by
- TreeEntity: 树型父类, 继承它的表至少需要8个字段id、created_time、created_by、updated_time、updated_by、parent_id、sort_value
其中id字段标记了
@TableId(value = "id", type = IdType.INPUT)
字段,表示在调用保存方法时,id字段的值,由"用户自己"设置。 然后Acuity-util又提供了AcuityMetaObjectHandler
类,已经帮您设置了id的值。 所以,你在调用保存方法时,无需给对象设置ID字段。当然,若您在保存某对象时,需要设置指定的id值,当你调用了entity.setId(xxx)
后,AcuityMetaObjectHandler
会保留你设置的ID。
缓存Key
- CacheKey: 封装k-v缓存的key和有效期
- CacheHashKey: 封装hash结构缓存的key和有效期
- CacheKeyBuilder: 缓存key的构造器
[示例]
java
public class BaseDictCacheKeyBuilder implements CacheKeyBuilder {
// 构造方法
public static CacheHashKey builder(Serializable dictKey) {
return new BaseDictCacheKeyBuilder().hashKey(dictKey);
}
// 构造方法
public static CacheHashKey builder(String dictKey, String field) {
return new BaseDictCacheKeyBuilder().hashFieldKey(field, dictKey);
}
// 前缀,用来区分同一个公司,不同的项目
@Override
public String getPrefix() {
return CacheKeyModular.PREFIX;
}
// 缓存那张表的数据
@Override
public String getTable() {
return CacheKeyTable.Base.BASE_DICT;
}
// 缓存那个模块的数据
@Override
public String getModular() {
return CacheKeyModular.BASE;
}
// 缓存的key包含那个字段
@Override
public String getField() {
return SuperEntity.ID_FIELD;
}
// 缓存值的类型
@Override
public ValueType getValueType() {
return ValueType.string;
}
}
public class BaseDictCacheKeyBuilder implements CacheKeyBuilder {
// 构造方法
public static CacheHashKey builder(Serializable dictKey) {
return new BaseDictCacheKeyBuilder().hashKey(dictKey);
}
// 构造方法
public static CacheHashKey builder(String dictKey, String field) {
return new BaseDictCacheKeyBuilder().hashFieldKey(field, dictKey);
}
// 前缀,用来区分同一个公司,不同的项目
@Override
public String getPrefix() {
return CacheKeyModular.PREFIX;
}
// 缓存那张表的数据
@Override
public String getTable() {
return CacheKeyTable.Base.BASE_DICT;
}
// 缓存那个模块的数据
@Override
public String getModular() {
return CacheKeyModular.BASE;
}
// 缓存的key包含那个字段
@Override
public String getField() {
return SuperEntity.ID_FIELD;
}
// 缓存值的类型
@Override
public ValueType getValueType() {
return ValueType.string;
}
}
java
public class BaseDictItemServiceImpl {
public BaseDict save(BaseDictItemSaveVO saveVO) {
BaseDict model = BeanUtil.toBean(saveVO, BaseDict.class);
ArgumentAssert.isFalse(checkItemByKey(model.getKey(), model.getParentId(), null), "字典[{}]已经存在,请勿重复创建", model.getKey());
BaseDict parent = getById(model.getParentId());
ArgumentAssert.notNull(parent, "字典不存在");
model.setParentKey(parent.getKey());
model.setClassify(DictClassifyEnum.BUSINESS.getCode());
superManager.save(model);
CacheHashKey hashKey = BaseDictCacheKeyBuilder.builder(model.getParentKey(), model.getKey());
cachePlusOps.hSet(hashKey, model.getName());
return model;
}
@Transactional(rollbackFor = Exception.class)
public boolean removeByIds(Collection<Long> idList) {
List<BaseDict> list = superManager.listByIds(idList);
if (CollUtil.isEmpty(list)) {
return false;
}
boolean flag = superManager.removeByIds(idList);
CacheHashKey[] hashKeys = list.stream().map(model -> BaseDictCacheKeyBuilder.builder(model.getParentKey(), model.getKey())).toArray(CacheHashKey[]::new);
cachePlusOps.del(hashKeys);
return flag;
}
}
public class BaseDictItemServiceImpl {
public BaseDict save(BaseDictItemSaveVO saveVO) {
BaseDict model = BeanUtil.toBean(saveVO, BaseDict.class);
ArgumentAssert.isFalse(checkItemByKey(model.getKey(), model.getParentId(), null), "字典[{}]已经存在,请勿重复创建", model.getKey());
BaseDict parent = getById(model.getParentId());
ArgumentAssert.notNull(parent, "字典不存在");
model.setParentKey(parent.getKey());
model.setClassify(DictClassifyEnum.BUSINESS.getCode());
superManager.save(model);
CacheHashKey hashKey = BaseDictCacheKeyBuilder.builder(model.getParentKey(), model.getKey());
cachePlusOps.hSet(hashKey, model.getName());
return model;
}
@Transactional(rollbackFor = Exception.class)
public boolean removeByIds(Collection<Long> idList) {
List<BaseDict> list = superManager.listByIds(idList);
if (CollUtil.isEmpty(list)) {
return false;
}
boolean flag = superManager.removeByIds(idList);
CacheHashKey[] hashKeys = list.stream().map(model -> BaseDictCacheKeyBuilder.builder(model.getParentKey(), model.getKey())).toArray(CacheHashKey[]::new);
cachePlusOps.del(hashKeys);
return flag;
}
}
txt
// 最终生成的key
lc:1:base:base_dict:id:string:TENANT_APPLICATION_TYPE
// 最终生成的key
lc:1:base:base_dict:id:string:TENANT_APPLICATION_TYPE
上下文信息
- ContextConstants : 上下文常量类。封装在请求头、上下文中的参数的Key名称。
- ThreadLocalParam : 线程变量参数对象
- ContextUtil : 上下文参数工具类
转换类
下文中提到的序列化和反序列化含义如下:
- 序列化 指JavaBean序列化为json字符串的过程。如:Controller层返回对象或列表数据给前端、存JavaBean数据到redis内存。
- 反序列化 指json字符串反序列化为JavaBean的过程。如:前端传递json数据到Controller层入参、java程序从redis读取数据转为JavaBean。
- 转换类详解
EnumDeserializer : 枚举类 jackson 自定义反序列化策略
这个类所在包为
com.fasterxml.jackson.databind.deser.std
,目的是覆盖 jackson 同包名下的同名类。实现了反序列化的规则的增强功能。javapublic enum Sex implements BaseEnum { M("男"), W("女"), N("未知"),; } public class User { Integer id; Sex sex; }
public enum Sex implements BaseEnum { M("男"), W("女"), N("未知"),; } public class User { Integer id; Sex sex; }
对于User类,使用jackson官方原始的EnumDeserializer类时,支持以下2种方式传递参数(反序列化):
json{"sex": "W"} // 可选值:W、M、N {"sex": 1} // 可选值: 0、1、2,对应的是Sex 枚举值的索引。 (M对应0、W对应1、N对应2)
{"sex": "W"} // 可选值:W、M、N {"sex": 1} // 可选值: 0、1、2,对应的是Sex 枚举值的索引。 (M对应0、W对应1、N对应2)
使用EnumDeserializer类时,除了支持上面的方式,还支持下面的方式:
json{"sex": { "code": "M" } }
{"sex": { "code": "M" } }
这个类的目的是为了配合 EnumSerializer 类使用。
EnumSerializer : 枚举类 jackson 自定义序列化策略
继承了
BaseEnum
接口的枚举值,将会按照以下格式序列化:json{"sex": { "code": "M", "desc": "男"} }
{"sex": { "code": "M", "desc": "男"} }
这个类的目的是枚举字段返回数据到前端时,前端方便回显中文描述。
最新版本,不在采用 EnumDeserializer、EnumSerializer 类实现枚举字段的回显,需要回显在字段上标记@Enum(api = Echo.ENUM_API)
AcuityLocalDateTimeDeserializer : LocalDateTime类 jackson 自定义反序列化策略
JavaBean的字段类型为LocalDateTime时,支持以下6种格式进行反序列化:
- yyyy-MM-dd
- yyyy年MM月dd日
- yyyy/MM/dd
- yyyy-MM-dd HH:mm:ss
- yyyy年MM月dd日HH时mm分ss秒
- yyyy/MM/dd HH:mm:ss
String2DateConverter : 字符串 转 Date (只能解决解决 @RequestParam 标记的参数)
- yyyy
- yyyy-MM
- yyyy-MM-dd
- yyyy-MM-dd HH
- yyyy-MM-dd HH:mm
- yyyy-MM-dd HH:mm:ss
- yyyy/MM
- yyyy/MM/dd
- yyyy/MM/dd HH
- yyyy/MM/dd HH:mm
- yyyy/MM/dd HH:mm:ss
- yyyy年MM月
- yyyy年MM月dd日
- yyyy年MM月dd日HH时mm分ss秒
String2LocalDateConverter : 字符串 转 LocalDate (只能解决解决 @RequestParam 标记的参数)
- yyyy-MM-dd
- yyyy/MM/dd
- yyyy年MM月dd日
String2LocalDateTimeConverter : 字符串 转 LocalDateTime (只能解决解决 @RequestParam 标记的参数)
- yyyy-MM-dd HH:mm:ss
- yyyy/MM/dd HH:mm:ss
- yyyy年MM月dd日HH时mm分ss秒
String2LocalTimeConverter : 字符串 转 LocalTime (只能解决解决 @RequestParam 标记的参数)
- HH:mm:ss
- HH时mm分ss秒
AcuityJacksonModule: jackson 自定义序列化 & 反序列化 规则
这个类用于定制Jsonson的序列化和反序列化规则,然后在
JsonUtil
工具类、SpringMvc全局ObjectMapper
(BaseConfig类)、redis序列化规则RedisObjectSerializer
acuity-cache-starter)
[说明]
为了统一后端返回数据到前端时,数据格式不规则、长整型数据精度丢失等问题,本项目配置了全局ObjectMapper类实现son序列化和反序列化时。
序列化:Controller层接口返回值 转成 json 格式的过程
反序列化:前端请求通过json格式提交参数到 Controller 层的过程
提示
配置全局ObjectMapper类后,会和yml配置文件中 spring.jackson.xxx 的配置产生冲突,所以请勿在yml中重复配置
全局配置
在BaseConfig类配置了全局的 ObjectMapper 实例, 并调整了objectMapper的默认序列化和反序列化规则。
java
@Bean
@Primary
@ConditionalOnClass(ObjectMapper.class)
@ConditionalOnMissingBean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper
// 设置当前位置
.setLocale(Locale.CHINA)
// 去掉默认的时间戳格式
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
// 时区
.setTimeZone(TimeZone.getTimeZone(ZoneId.systemDefault()))
// Date参数日期格式
.setDateFormat(new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT, Locale.CHINA))
// 该特性决定parser是否允许JSON字符串包含非引号控制字符(值小于32的ASCII字符,包含制表符和换行符)。 如果该属性关闭,则如果遇到这些字符,则会抛出异常。JSON标准说明书要求所有控制符必须使用引号,因此这是一个非标准的特性
.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true)
// 忽略不能转义的字符
.configure(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER.mappedFeature(), true)
// 在使用spring boot + jpa/hibernate,如果实体字段上加有FetchType.LAZY,并使用jackson序列化为json串时,会遇到SerializationFeature.FAIL_ON_EMPTY_BEANS异常
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
// 忽略未知字段
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
// 单引号处理
.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
// 注册自定义模块
objectMapper.registerModule(new AcuityJacksonModule())
.findAndRegisterModules();
}
public class AcuityJacksonModule extends SimpleModule {
public AcuityJacksonModule() {
super();
// 定义LocalDateTime、LocalDate、LocalTime 反序列化规则
this.addDeserializer(LocalDateTime.class, AcuityLocalDateTimeDeserializer.INSTANCE);
this.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
this.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
// 定义LocalDateTime、LocalDate、LocalTime 序列化规则
this.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
this.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
this.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
// 定义Long、BigInteger、BigDecimal的序列化规则
this.addSerializer(Long.class, ToStringSerializer.instance);
this.addSerializer(Long.TYPE, ToStringSerializer.instance);
this.addSerializer(BigInteger.class, ToStringSerializer.instance);
this.addSerializer(BigDecimal.class, ToStringSerializer.instance);
}
}
@Bean
@Primary
@ConditionalOnClass(ObjectMapper.class)
@ConditionalOnMissingBean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper
// 设置当前位置
.setLocale(Locale.CHINA)
// 去掉默认的时间戳格式
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
// 时区
.setTimeZone(TimeZone.getTimeZone(ZoneId.systemDefault()))
// Date参数日期格式
.setDateFormat(new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT, Locale.CHINA))
// 该特性决定parser是否允许JSON字符串包含非引号控制字符(值小于32的ASCII字符,包含制表符和换行符)。 如果该属性关闭,则如果遇到这些字符,则会抛出异常。JSON标准说明书要求所有控制符必须使用引号,因此这是一个非标准的特性
.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true)
// 忽略不能转义的字符
.configure(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER.mappedFeature(), true)
// 在使用spring boot + jpa/hibernate,如果实体字段上加有FetchType.LAZY,并使用jackson序列化为json串时,会遇到SerializationFeature.FAIL_ON_EMPTY_BEANS异常
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
// 忽略未知字段
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
// 单引号处理
.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
// 注册自定义模块
objectMapper.registerModule(new AcuityJacksonModule())
.findAndRegisterModules();
}
public class AcuityJacksonModule extends SimpleModule {
public AcuityJacksonModule() {
super();
// 定义LocalDateTime、LocalDate、LocalTime 反序列化规则
this.addDeserializer(LocalDateTime.class, AcuityLocalDateTimeDeserializer.INSTANCE);
this.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
this.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
// 定义LocalDateTime、LocalDate、LocalTime 序列化规则
this.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
this.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
this.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
// 定义Long、BigInteger、BigDecimal的序列化规则
this.addSerializer(Long.class, ToStringSerializer.instance);
this.addSerializer(Long.TYPE, ToStringSerializer.instance);
this.addSerializer(BigInteger.class, ToStringSerializer.instance);
this.addSerializer(BigDecimal.class, ToStringSerializer.instance);
}
}
序列化配置项
参见 常用配置 -序列化与反序列化
反序列化配置项
反序列化跟序列化刚好相反,是将前端传递的json数据转换为JavaBean的过程。
String -> Long 字符串类型的长整型数字,会转换为Long
String -> BaseEnum 符合枚举值的字符串,可以转换为BaseEnum
String -> LocalDate, 支持前端传递格式:
yyyy-MM-dd
: 如:2021-11-11String -> LocalDateTime, 支持前端传递格式:
yyyy-MM-dd
: 如:2021-11-11yyyy/MM/dd
: 如:2021/11/11yyyy年MM月dd日
: 如:2021年11月11日yyyy-MM-dd HH:mm:ss
: 如:2021-11-11 11:11:11yyyy/MM/dd HH:mm:ss
: 如:2021/11/11 11:11:11yyyy年MM月dd日HH时mm分ss秒
: 如:2021年11月11日11时11分11秒String -> LocalTime
支持前端传递格式:
HH:mm:ss
工具类
- JsonUtil : 全局的 Jackson 工具类
- DistributedLock : 分布式锁接口
- AntiSqlFilterUtils : sql注入过滤工具
- ArgumentAssert : 业务参数断言
- CollHelper : 集合帮助类
- DateUtils : 日期工具类
- DefValueHelper : 默认值帮助类
- PingYinUtil : 拼音工具类
- SpringUtils : Spring工具类
- StrHelper : 字符串帮助类
- StrPool : 字符串常量
- TreeUtil : 树型结构工具类
- ValidatorUtil : 正则验证工具类
- DbUtil:数据库相关工具类
- ClassUtils:class文件工具
- BeanPlusUtil:糊涂的BeanUtil增强类
自定义异常
ExceptionCode
自定义异常错误码,常用错误码为
- 0:操作成功
- 200:操作成功,为了兼容xxl-job,200也表示成功,acuity系统中推荐使用0表示成功
- -1~-13:系统常用的异常编码,详情见 AbstractGlobalExceptionHandler 中方法的返回值
- 401:登录未授权。 客户端在访问请求的资源之前,对token进行验证,token无法正常解析时,返回此错误码,可以简单的理解为没有登录此站。
- 403:访问资源被禁止。 资源不可用,服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致,可以简单的理解为没有权限访问此站。
ArgumentException
业务参数异常。用于在业务中,检测到非法参数时,进行抛出的异常。
BizException
业务异常。用于在处理业务逻辑遇到问题时,抛出此异常。
ForbiddenException
无权限访问某资源时,抛出此异常。
UnauthorizedException
没有登录此系统时,抛出此异常。