Skip to content

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

  1. 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  // 后端响应时的时间戳
}
  1. SuperEntity: 超级父类, 继承它的表至少需要3个字段id、created_time、created_by
  2. Entity: 通用父类, 继承它的表至少需要5个字段id、created_time、created_by、updated_time、updated_by
  3. 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

  1. CacheKey: 封装k-v缓存的key和有效期
  2. CacheHashKey: 封装hash结构缓存的key和有效期
  3. 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

上下文信息

  1. ContextConstants : 上下文常量类。封装在请求头、上下文中的参数的Key名称。
  2. ThreadLocalParam : 线程变量参数对象
  3. ContextUtil : 上下文参数工具类

转换类

下文中提到的序列化和反序列化含义如下:

  1. 序列化 指JavaBean序列化为json字符串的过程。如:Controller层返回对象或列表数据给前端、存JavaBean数据到redis内存。
  2. 反序列化 指json字符串反序列化为JavaBean的过程。如:前端传递json数据到Controller层入参、java程序从redis读取数据转为JavaBean。
  • 转换类详解
  1. EnumDeserializer : 枚举类 jackson 自定义反序列化策略

    这个类所在包为com.fasterxml.jackson.databind.deser.std ,目的是覆盖 jackson 同包名下的同名类。实现了反序列化的规则的增强功能。

    java
    public 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 类使用。

  2. EnumSerializer : 枚举类 jackson 自定义序列化策略

    继承了BaseEnum接口的枚举值,将会按照以下格式序列化:

    json
    {"sex": { "code": "M", "desc": "男"} }
    {"sex": { "code": "M", "desc": "男"} }

    这个类的目的是枚举字段返回数据到前端时,前端方便回显中文描述。

    最新版本,不在采用 EnumDeserializer、EnumSerializer 类实现枚举字段的回显,需要回显在字段上标记@Enum(api = Echo.ENUM_API)

  3. 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
  4. 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秒
  5. String2LocalDateConverter : 字符串 转 LocalDate (只能解决解决 @RequestParam 标记的参数)

    • yyyy-MM-dd
    • yyyy/MM/dd
    • yyyy年MM月dd日
  6. String2LocalDateTimeConverter : 字符串 转 LocalDateTime (只能解决解决 @RequestParam 标记的参数)

    • yyyy-MM-dd HH:mm:ss
    • yyyy/MM/dd HH:mm:ss
    • yyyy年MM月dd日HH时mm分ss秒
  7. String2LocalTimeConverter : 字符串 转 LocalTime (只能解决解决 @RequestParam 标记的参数)

    • HH:mm:ss
    • HH时mm分ss秒
  8. AcuityJacksonModule: jackson 自定义序列化 & 反序列化 规则

    这个类用于定制Jsonson的序列化和反序列化规则,然后在JsonUtil工具类、SpringMvc全局ObjectMapper(BaseConfig类)、redis序列化规则 RedisObjectSerializeracuity-cache-starter)

[说明]

为了统一后端返回数据到前端时,数据格式不规则、长整型数据精度丢失等问题,本项目配置了全局ObjectMapper类实现son序列化和反序列化时。

  1. 序列化:Controller层接口返回值 转成 json 格式的过程

  2. 反序列化:前端请求通过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的过程。

  1. String -> Long 字符串类型的长整型数字,会转换为Long

  2. String -> BaseEnum 符合枚举值的字符串,可以转换为BaseEnum

  3. String -> LocalDate, 支持前端传递格式:

    • yyyy-MM-dd: 如:2021-11-11
  4. String -> LocalDateTime, 支持前端传递格式:

    • yyyy-MM-dd: 如:2021-11-11
    • yyyy/MM/dd: 如:2021/11/11
    • yyyy年MM月dd日: 如:2021年11月11日
    • yyyy-MM-dd HH:mm:ss: 如:2021-11-11 11:11:11
    • yyyy/MM/dd HH:mm:ss: 如:2021/11/11 11:11:11
    • yyyy年MM月dd日HH时mm分ss秒: 如:2021年11月11日11时11分11秒
  5. String -> LocalTime

    支持前端传递格式: HH:mm:ss

工具类

  1. JsonUtil : 全局的 Jackson 工具类
  2. DistributedLock : 分布式锁接口
  3. AntiSqlFilterUtils : sql注入过滤工具
  4. ArgumentAssert : 业务参数断言
  5. CollHelper : 集合帮助类
  6. DateUtils : 日期工具类
  7. DefValueHelper : 默认值帮助类
  8. PingYinUtil : 拼音工具类
  9. SpringUtils : Spring工具类
  10. StrHelper : 字符串帮助类
  11. StrPool : 字符串常量
  12. TreeUtil : 树型结构工具类
  13. ValidatorUtil : 正则验证工具类
  14. DbUtil:数据库相关工具类
  15. ClassUtils:class文件工具
  16. BeanPlusUtil:糊涂的BeanUtil增强类

自定义异常

  1. ExceptionCode

    自定义异常错误码,常用错误码为

    • 0:操作成功
    • 200:操作成功,为了兼容xxl-job,200也表示成功,acuity系统中推荐使用0表示成功
    • -1~-13:系统常用的异常编码,详情见 AbstractGlobalExceptionHandler 中方法的返回值
    • 401:登录未授权。 客户端在访问请求的资源之前,对token进行验证,token无法正常解析时,返回此错误码,可以简单的理解为没有登录此站。
    • 403:访问资源被禁止。 资源不可用,服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致,可以简单的理解为没有权限访问此站。
  2. ArgumentException

    业务参数异常。用于在业务中,检测到非法参数时,进行抛出的异常。

  3. BizException

    业务异常。用于在处理业务逻辑遇到问题时,抛出此异常。

  4. ForbiddenException

    无权限访问某资源时,抛出此异常。

  5. UnauthorizedException

    没有登录此系统时,抛出此异常。

欢迎使用天源云Saas快速开发系统