Skip to content
sika-code edited this page Jul 20, 2019 · 1 revision

common【不依赖于外部资源的公共组件】

What

  • 通用工具集合
  • 基础接口和基础类集合

Why

  • 规范编码
  • 减少重复性工作
  • 提高开发效率

How

  • 集成apache-common等组件
  • 集成hutool组件
  • 集成FastJson进行json的序列化和反序列化
  • 集成lombok组件优化代码结构
  • 抽象业务通性形成基础接口和类

Common组件使用说明

名称 备注
basic 基础类和接口
common 通用工具类集合
config 通用配置
consumer 消费组件
database 数据库公共类
exception 异常处理组件
informer 通知组件
no 编号组件
result 返回结果组件

basic

名称 备注
BaseErrorCode 错误枚举类、配合BusinessException使用
TypeEnumInf 类型枚举类
BaseService 提供基础业务逻辑功能
BaseDomain 基础领域类、提供访问spring容器管理的Bean
BaseMsgDTO 基础消息数据传输类、统一消息格式
BaseRequestBO 基础请求逻辑类
BaseResponseBO 基础响应逻辑类
BaseUtil 基础工具类、提供基础的判空和判等方法
Assert 断言工具类、提供基础校验

common

名称 备注
DateUtil 日期工具、提供操作日期的公共方法
BeanFactory 实例工厂、创建实例
RequestUtil 请求工具、封装请求相关的方法
JSONUtil json序列化反序列化工具、封装了通用的序列化和反序列化方法
LogUtil 日志工具、提供统一格式的日志处理方式
NumberUtil 数值工具、提供数值型的公共方法
SpringUtil 获取Spring容器实例工具
StringUtil 处理字符串工具
Executors 管理线程池的创建、对Executors的基础封装
ThreadLocalManager 本地线程管理工具、简化ThreadLocal的使用、自动清理ThreadLocal对象
TreeBuilder 树结构构造者
WorkspaceProperties 工作空间属性、区分实例部署的工作空间

config

名称 备注
JacksonConfig Jackson序列化和反序列化配置
CorsConfig 跨域支持配置

exception

名称 备注
ExceptionAdvice 统一异常处理
ExceptionConfig 异常配置
BaseBusinessExceptionDTO 基础服务异常数据传输对象
ExceptionProperties 异常属性
BusinessException 业务系统异常

informer

【消息通知组件】【可以依据消息链表进行通知】

名称 备注
NoFactory 变成工厂、封装常用的编号生成方法
InformerConfig 通知配置类
DingdingMessageDTO 钉钉通知的数据传输对
InformerForDingding 通知到钉钉群
InformerForLog 通知到Log
InformerProperties 通知属性
BaseInformer 通知基础类、不同的通知者通过继承该类来实现自己的通知机制

no

【编号组件】【封装编号生成策略】

名称 备注
NoFactory 编号创建工厂、封装常用的编号生成方法
NoGenerator 编号生成者、具体生成编号的类
NoProperties 编号属性
NoGeneratorTimeFormatStrategy 编号时间格式化策略
NoGeneratorOrderSuffixStrategy 有序后缀策略
NoGeneratorRandomSuffixStrategy 随机后缀策略

result

【统一的返回结果】

名称 备注
Result 统一的返回对象
ResultConfig 配置
ResultGenerator Result对象生成者

示例

basic

BaseErrorCode

/**
 * 
 * <p>
 * 错误代码常量示例枚举
 * </p>
 *
 * @author daiqi
 * 创建时间    2018年2月2日 下午4:07:03
 */
@Getter
@AllArgsConstructor
public enum DemoErrorCodeEnum implements BaseErrorCode {
	/** 成功---BASE_000000 */
	SUCCESS("BASE_000000", "成功"),
	/** 异常---系统错误---BASE_000001 */
	SYS_ERROR("BASE_000001", "系统错误"),
	;

	private String code;
	private String message;
}

TypeEnumInf

/**
 * <p>
 * 示例类型枚举
 * </p>
 *
 * @author daiqi
 * @创建时间 2018年6月8日 上午11:42:53
 */
@Getter
@AllArgsConstructor
public enum DemoTypeEnum implements TypeEnumInf {
    /**
     * 示例1---1---示例
     */
    DEMO1(1, "示例"),
    ;
    private Integer type;
    private String desc;

}

BaseService

/**
 * <p>Description: 自定义类</p>
 *
 * <pre>
 *     泛型顺序
 *     1 Mapper
 *     2 Entity
 *     3 DTO
 *     其中Mapper和Entity的顺序必须放在最前
 * </pre>
 *
 * @author daiqi
 * @date 2018/8/30
 */
public abstract class DemoServiceImpl<M extends BaseSMapper<Entity>, Entity extends BaseEntity, DTO extends BaseDTO> extends BaseService<M, Entity> {

}

BaseDomain

/**
 * <p>
 * 示例 领域类
 * </p>
 *
 * @author daiqi
 * @since 2019-05-29 19:55:01
 */
public interface DemoDomain extends BaseDomain {

    /**
     * <p>
     * 获取当前模块的service
     * </p>
     *
     * @param
     * @return DemoService
     * @author daiqi
     * @date 2019/5/13 13:53
     */
    default DemoService service() {
        return getBean(DemoService.class);
    }

    /**
     * <p>
     * 获取demoLogic
     * </p>
     *
     * @param
     * @return DemoLogic
     * @author daiqi
     * @date 2019/5/13 13:53
     */
    default DemoLogic logic() {
        return getBean(DemoLogic.class);
    }
}

BaseMsgDTO

/**
 * 消息队列数据传输对象
 *
 * @author daiqi
 * @create 2019-06-29 20:42
 */
@Data
@Accessors(chain = true)
public class MqMsgDTO extends BaseMsgDTO {
    /**
     * 数据类型
     */
    private MqDataType dataType;

    public MqMsgDTO() {
    }

    public MqMsgDTO(Object data) {
        init(data, BaseErrorCodeEnum.SUCCESS);
    }

    public MqMsgDTO(Object data, BaseErrorCode errorCode) {
        init(data, errorCode);
    }

    /**
     * <p>
     * 根据数据创建实例
     * </p>
     *
     * @param data : 传输的数据
     * @return MqMsgDTO
     * @author daiqi
     * @date 2019/6/29 21:01
     */
    public static MqMsgDTO newInstance(Object data) {
        return new MqMsgDTO(data);
    }

    /**
     * <p>
     * 创建MqDTO对象
     * </p>
     *
     * @param data      : 具体数据
     * @param errorCode : 错误枚举类
     * @return MqMsgDTO
     * @author daiqi
     * @date 2019/6/29 21:54
     */
    public static MqMsgDTO newInstance(Object data, BaseErrorCode errorCode) {
        return new MqMsgDTO(data, errorCode);
    }
}

common

JSONUtil

/**
 * 测试JSONUtil方法
 */
@Slf4j
public class TestJSONUtil {
    /**
     * 测试对象-JSON字符串
     */
    @Test
    public void testToString() {
        BaseMsgDTO msgDTO = new BaseMsgDTO();
        msgDTO.setCode("T_00001");
        msgDTO.setMessage("测试");
        log.info("转换后的JSON字符串:{}", JSONUtil.toJSONString(msgDTO));
    }

    /**
     * 测试对象\JSON字符串 - 对象
     */
    @Test
    public void testParseObject() {
        BaseMsgDTO msgDTO = new BaseMsgDTO();
        msgDTO.setCode("T_00001");
        msgDTO.setMessage("测试");

        BaseMsgDTO msgDTONew = JSONUtil.parseObject(msgDTO, BaseMsgDTO.class);

        log.info("转换后的对象:{}", JSONUtil.toJSONString(msgDTONew));
    }

    /**
     * 测试对象列表\JSON数组字符串 - 对象列表
     */
    @Test
    public void testParseArray() {
        BaseMsgDTO msgDTO1 = new BaseMsgDTO();
        msgDTO1.setCode("T_00001");
        msgDTO1.setMessage("测试");
        BaseMsgDTO msgDTO2 = new BaseMsgDTO();
        msgDTO2.setCode("T_00001");
        msgDTO2.setMessage("测试");
        List<BaseMsgDTO> msgDTOS = Lists.newArrayList();
        msgDTOS.add(msgDTO1);
        msgDTOS.add(msgDTO2);

        List<BaseMsgDTO> msgDTOSNew = JSONUtil.parseArray(msgDTOS, BaseMsgDTO.class);

        log.info("转换后的数组:{}", JSONUtil.toJSONString(msgDTOSNew));
    }
}

ThreadLocalManager

    /** 测试ThreadLocal */
    public void testThreadLocal() {
        String accessRuleTypeKey = "access_rule_type:update";
        AccessRuleTypeDTO accessRuleTypeUpdate = new AccessRuleTypeDTO();
        /** 若不需要在子线程中设置则不需要手动清理ThreadLocal */
        // 默认的设置方法 --- 设置到ThreadLocal中
        ThreadLocalManager.set(accessRuleTypeKey, new AccessRuleTypeDTO());
        // 显示的设置到ThreadLocal中
        ThreadLocalManager.setThreadLocal(accessRuleTypeKey, accessRuleTypeUpdate);
        
        /** 注意 若使用如下方式需要意味着需要在子线程中进行使用、则建议手动的清理 */
        // 1:设置为手动清除
        ThreadLocalManager.setManualCleanToInheritable(true);
        // 2:显示的设置到InheritableThreadLocal
        ThreadLocalManager.setInheritable(accessRuleTypeKey, accessRuleTypeUpdate);
        // 1:设置为手动清除
        ThreadLocalManager.setManualCleanToAll(true);
        // 2:显示的设置到ThreadLocal和InheritableThreadLocal
        ThreadLocalManager.setThreadLocalAndInheritable(accessRuleTypeKey, accessRuleTypeUpdate);
        /**------------------------------------------------*/

    }

config


exception

/**
 * 
 * <p>
 * 校验列表为空
 * </p>
 *
 * <pre>
 * 列表为空抛出异常
 * </pre>
 *
 * @param obj : List : 待校验的List实例
 * @param formatValues : Object... : 格式化错误信息的的值
 * @author daiqi
 * @创建时间 2018年6月9日 下午3:32:41
 */
public static void verifyListNull(Collection<?> obj, Object... formatValues) {
	if (BaseUtil.isNull(obj)) {
		throw new BusinessException(BaseErrorCodeEnum.LIST_NULL).buildFormatValues(formatValues);
	}
}

informer【消息通知组件】【可以依据消息链表进行通知】


no【编号组件】【封装编号生成策略】

/**
 * <p>
 * 创建秒和有序的编号生产者
 * </p>
 *
 * @param init : 初始值
 * @return NoGenerator
 * @author daiqi
 * @date 2019/7/2 23:36
 */
public static NoGenerator createSecondShortOrder(long init) {
    NoGenerator noGenerator = new NoGenerator()
            .setFormatStrategy(NoGeneratorTimeFormatStrategy.SECOND_SHORT_YEAR)
            .setSuffixStrategy(new NoGeneratorOrderSuffixStrategy(init));
            
    // 编号前缀
    String prefix = "TS";
    // 后缀字符串的长度
    int suffixCount = 6;
    noGenerator.generateNoCore(prefix, suffixCount);
}

result【统一的返回结果】

/**
 * 测试Result
 *
 * @author daiqi
 * @create 2018-11-29 20:22
 */
 @Component
public class DemoResult {

    @Autowired
    private ResultGenerator resultGenerator;

    protected Result generateResult(Object object) {
        return resultGenerator.generateResult(object);
    }
}