-
Notifications
You must be signed in to change notification settings - Fork 118
common
sika-code edited this page Jul 20, 2019
·
1 revision
common【不依赖于外部资源的公共组件】
- 通用工具集合
- 基础接口和基础类集合
- 规范编码
- 减少重复性工作
- 提高开发效率
- 集成apache-common等组件
- 集成hutool组件
- 集成FastJson进行json的序列化和反序列化
- 集成lombok组件优化代码结构
- 抽象业务通性形成基础接口和类
名称 | 备注 |
---|---|
basic | 基础类和接口 |
common | 通用工具类集合 |
config | 通用配置 |
consumer | 消费组件 |
database | 数据库公共类 |
exception | 异常处理组件 |
informer | 通知组件 |
no | 编号组件 |
result | 返回结果组件 |
名称 | 备注 |
---|---|
BaseErrorCode | 错误枚举类、配合BusinessException使用 |
TypeEnumInf | 类型枚举类 |
BaseService | 提供基础业务逻辑功能 |
BaseDomain | 基础领域类、提供访问spring容器管理的Bean |
BaseMsgDTO | 基础消息数据传输类、统一消息格式 |
BaseRequestBO | 基础请求逻辑类 |
BaseResponseBO | 基础响应逻辑类 |
BaseUtil | 基础工具类、提供基础的判空和判等方法 |
Assert | 断言工具类、提供基础校验 |
名称 | 备注 |
---|---|
DateUtil | 日期工具、提供操作日期的公共方法 |
BeanFactory | 实例工厂、创建实例 |
RequestUtil | 请求工具、封装请求相关的方法 |
JSONUtil | json序列化反序列化工具、封装了通用的序列化和反序列化方法 |
LogUtil | 日志工具、提供统一格式的日志处理方式 |
NumberUtil | 数值工具、提供数值型的公共方法 |
SpringUtil | 获取Spring容器实例工具 |
StringUtil | 处理字符串工具 |
Executors | 管理线程池的创建、对Executors的基础封装 |
ThreadLocalManager | 本地线程管理工具、简化ThreadLocal的使用、自动清理ThreadLocal对象 |
TreeBuilder | 树结构构造者 |
WorkspaceProperties | 工作空间属性、区分实例部署的工作空间 |
名称 | 备注 |
---|---|
JacksonConfig | Jackson序列化和反序列化配置 |
CorsConfig | 跨域支持配置 |
名称 | 备注 |
---|---|
ExceptionAdvice | 统一异常处理 |
ExceptionConfig | 异常配置 |
BaseBusinessExceptionDTO | 基础服务异常数据传输对象 |
ExceptionProperties | 异常属性 |
BusinessException | 业务系统异常 |
【消息通知组件】【可以依据消息链表进行通知】
名称 | 备注 |
---|---|
NoFactory | 变成工厂、封装常用的编号生成方法 |
InformerConfig | 通知配置类 |
DingdingMessageDTO | 钉钉通知的数据传输对 |
InformerForDingding | 通知到钉钉群 |
InformerForLog | 通知到Log |
InformerProperties | 通知属性 |
BaseInformer | 通知基础类、不同的通知者通过继承该类来实现自己的通知机制 |
【编号组件】【封装编号生成策略】
名称 | 备注 |
---|---|
NoFactory | 编号创建工厂、封装常用的编号生成方法 |
NoGenerator | 编号生成者、具体生成编号的类 |
NoProperties | 编号属性 |
NoGeneratorTimeFormatStrategy | 编号时间格式化策略 |
NoGeneratorOrderSuffixStrategy | 有序后缀策略 |
NoGeneratorRandomSuffixStrategy | 随机后缀策略 |
【统一的返回结果】
名称 | 备注 |
---|---|
Result | 统一的返回对象 |
ResultConfig | 配置 |
ResultGenerator | Result对象生成者 |
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);
}
}
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);
/**------------------------------------------------*/
}
/**
*
* <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);
}
}
/**
* <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
*
* @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);
}
}