目录
1. XxxClassl 类 public xxx() → new XxxClass()
2. XxxClassl 类 public static xxx() → XxxClass.xxx()
1. public interface XxxMapper → private final XxxMapper
2. public interface IXxxService → private final IXxxService
0. LocalDateTime 用法 - 详参 : LocalDateTime用法_微风粼粼的博客-CSDN博客
1. format.parse() - Java 8 新添 API 用于 : 解析日期 和 时间
2. LocalDateTime.parse(date , dtf);
3. LocalDateTime - 实体类层直接拦截 , 未进入 Impl 业务层
1. ResultHandler.AIPredictResultHandler.java
2. StructureEnumConstants.java
4. interface 里定义 interface ( 为了减少接口的定义 , 同时将常量分类 )
1. 自定义工具类 概念 / 解析
1. 构建方式
认知:
1、参数传递 ,BaseMapper
2、泛型
3、static ( 可以使用 static 静态方法将调用简化,也可以使用 private 的方法私有化,让别人不可以随机调用对象 )
原始:
public class EnhancedCode<T> {
@Autowired
BaseMapper baseMapper;
// 校验:资源是否存在
public void checkResource(Integer id){
Object object = baseMapper.selectById(id);
if(null == object){
throw new RuntimeException("参数:" + id + ",对应资源不存在,请核实后输入");
}
}
}
public class EnhancedCode<T extends BaseMapper> {
@Autowired
BaseMapper baseMapper;
// 校验:资源是否存在
public void checkResource(Integer id){
Object object = baseMapper.selectById(id);
if(null == object){
throw new RuntimeException("参数:" + id + ",对应资源不存在,请核实后输入");
}
}
}
1. XxxClassl 类 public xxx() → new XxxClass()
public class EnhancedCode<T extends BaseMapper> {
// @Autowired
// BaseMapper baseMapper;
// 校验:资源是否存在
public void checkResource(Integer id , BaseMapper baseMapper){
Object object = baseMapper.selectById(id);
if(null == object){
throw new RuntimeException("参数:" + id + ",对应资源不存在,请核实后输入");
}
}
}
BaseMapper baseMapper; 依赖抽模,存在工具类与业务层具体实现的 XxxServiceImpl 里 XxxMapper 不一致的问题
导致最终无法实现期望结果
@Override
public Boolean deleteIotCashTransfer(Integer id) {
// 校验:资源是否存在
EnhancedCode<IotCashTransferMapper> enhancedCode = new EnhancedCode<>();
enhancedCode.checkResource(id ,iotCashTransferMapper);
this.removeById(id);
return Boolean.TRUE;
}
2. XxxClassl 类 public static xxx() → XxxClass.xxx()
静态方法,直接使用,不需要 new
public class EnhancedCode{
// @Autowired
// BaseMapper baseMapper;
// 校验:资源是否存在
public static void checkResource(Integer id ,BaseMapper baseMapper){
Object obj = baseMapper.selectById(id);
if(null == obj){
throw new RuntimeException("参数:" + id + ",对应资源不存在,请核实后输入");
}
}
}
@Override
public Boolean deleteIotCashTransfer(Integer id) {
// 校验:资源是否存在
// EnhancedCode<IotCashTransferMapper> enhancedCode = new EnhancedCode<>();
// enhancedCode.checkResource(id ,iotCashTransferMapper);
EnhancedCode.checkResource(id,baseMapper);
this.removeById(id);
return Boolean.TRUE;
}
2. Interface
1. public interface XxxMapper → private final XxxMapper
2. public interface IXxxService → private final IXxxService
3. 获取任意泛型类的某个属性
参考:
java在泛型类 T 上利用反射取属性值 - 雪化山河 - 博客园 java在泛型类 T 上利用反射取属性值
获取任意泛型类的某个属性_shunfengshunshui_的博客-CSDN博客_获取范类型的属性 获取任意泛型类的某个属性
mybatis-plus实现 相似实体类使用泛型操作同样的逻辑代码更新保存修改的方法_sgambler的博客-CSDN博客_mybatisplus 泛型 mybatis-plus 实现 相似实体类使用泛型操作同样的逻辑代码更新保存修改的方法
2. 自定义工具类注意事项 ( 踩坑 )
1. 待定
3. 通用工具类
1. 时间 : 入参格式校验
0. LocalDateTime 用法 - 详参 : LocalDateTime用法_微风粼粼的博客-CSDN博客
详参 :
JDK1.8 中 LocalDateTime 时间格式化两种方案_北冥的鱼_修行的博客-CSDN博客_localdatetime 格式化
1. format.parse() - Java 8 新添 API 用于 : 解析日期 和 时间
package com.hzcloud.iot.resource.utils;
/**
* @Author:menghuan
* @Date:2020/9/28 11:58
*/
import org.junit.jupiter.api.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class isValidDate{
/**
* 验证日期格式是否满足要求
* @param str 需要验证的日期格式
* @param formatString 验证的标准格式 , 如:(yyyy/MM/dd HH:mm:ss)
* @return 返回验证结果
*/
public static boolean isValidDate(String str , String formatString) {
// 指定日期格式 , 注意yyyy/MM/dd区分大小写;
SimpleDateFormat format = new SimpleDateFormat(formatString);
try {
// 设置lenient为false.
// 否则SimpleDateFormat会比较宽松地验证日期 , 比如2007/02/29会被接受 , 并转换成2007/03/01
format.setLenient(false);
format.parse(str);
} catch (ParseException e) {
// e.printStackTrace();
// 如果throw java.text.ParseException或者NullPointerException , 就说明格式不对
return false;
}
return true;
}
@Test
public void test1(){
String str = "2020-08-22 16:04:00";
String formatString = "yyyy-MM-dd HH:mm:ss";
boolean validDate = isValidDate(str , formatString);
System.out.println(validDate);
}
}
//时间参数校验
boolean checkStartTime = isValidDate.ValidDate(iotContractDTO.getStartTime().toString() , "yyyy-MM-dd HH:mm:ss");
if(!checkStartTime){
throw new IotContractException(iotContractDTO.getStartTime() + "时间格式异常 , 请核实后输入");
}
boolean checkEndTime = isValidDate.ValidDate(iotContractDTO.getEndTime().toString() , "yyyy-MM-dd HH:mm:ss");
if(!checkEndTime){
throw new IotContractException(iotContractDTO.getEndTime() + "时间格式异常 , 请核实后输入");
}
2. LocalDateTime.parse(date , dtf);
package com.tsy.repository.utils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* @description 校验时间格式
* @Author: menghuan
* @Date: 2021/1/5 17:08
*/
public class IsDateVail {
/**
* 校验时间格式是否为 yyyy-MM-dd HH:mm:ss
* @param date
* @return
*/
private static final String PATTERN_DEFAULT = "yyyy-MM-dd HH:mm:ss";
public static Boolean isDateVail(String date) {
//用于指定 日期/时间 模式
// DateTimeFormatter dtf = DateTimeFormatter.ofPattern(DateTimeUtil.PATTERN_DEFAULT);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(PATTERN_DEFAULT);
boolean flag = true;
try {
//Java 8 新添API 用于解析日期和时间
LocalDateTime.parse(date , dtf);
} catch (Exception e) {
flag = false;
}
return flag;
}
public static void main(String[] args) {
Boolean dateVail = IsDateVail.isDateVail("2021-01-05 12:00:00");
System.out.println(dateVail);
}
}
3. LocalDateTime - 实体类层直接拦截 , 未进入 Impl 业务层
@ApiModelProperty(value = "生效时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
@NotBlank(message = "合约生效时间[startTime]不能为空" , groups = {Save.class})
private LocalDateTime startTime;
@ApiModelProperty(value = "截止时间")
@NotBlank(message = "合约截止时间[endTime]不能为空" , groups = {Save.class})
private LocalDateTime endTime;
{
"code": 1 ,
"msg": "JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String \"2020-08-23 16:04\": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2020-08-23 16:04' could not be parsed at index 16; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime` from String \"2020-08-23 16:04\": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2020-08-23 16:04' could not be parsed at index 16\n at [Source: (PushbackInputStream); line: 9 , column: 16] (through reference chain: com.hzcloud.iot.contract.dto.IotContractDTO[\"endTime\"])" ,
"data": null
}
4. LocalDateTime 局部格式化
// 声明需要格式化的格式(日期加时间)
DateTimeFormatter dfDateTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 将当前日期进行格式化
String format = dfDateTime.format(LocalDateTime.now());
简化
// 将当前日期进行格式化
String format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
System.out.printf("Consumer Started: %s %n", format);
LocalDateTime.now()
默认输出格式 : 2021-01-05T12:00
LocalDateTime 在 GMT+8 默认格式为 yyyy-MM-ddTHH:mm:ss , 如 2021-01-01T10:15:12
比如需要格式化为 : yyyy-MM-dd HH:mm:ss
2. 罗马数字 与 阿拉伯数字 互转
1. RomeToArabic.java
package com.tsy.repository.utils;
/**
* @Author:menghuan
* @Date:2020/12/22 15:47
*/
import java.util.Scanner;
/**
* 请编写程序 , 由用户输入若干个罗马数字串 , 程序输出对应的十进制表示。
* <p>
* 输入格式是:第一行是整数n , 表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。
* <p>
* 要求程序输出n行 , 就是罗马数字对应的十进制数据。
* <p>
* 例如 , 用户输入: 3 LXXX XCIII DCCII
* <p>
* 则程序应该输出: 80 93 702
*
* @author Administrator
*/
public class RomeToArabic {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("程序员之家测试结果:");
Scanner mScanner = new Scanner(System.in);
System.out.println(r2a(mScanner.nextLine()));
System.out.println(a2r(mScanner.nextInt()));
}
/**
* 把罗马数字转换为阿拉伯数字
* @param String m
* @return int sum
*/
public static int r2a(String m) {
int[] graph = new int[400];
graph['I'] = 1;
graph['V'] = 5;
graph['X'] = 10;
graph['L'] = 50;
graph['C'] = 100;
graph['D'] = 500;
graph['M'] = 1000;
char[] num = m.toCharArray();
int sum = graph[num[0]];
for (int i = 0; i < num.length - 1; i++) {
if (graph[num[i]] >= graph[num[i + 1]]) {
sum += graph[num[i + 1]];
} else {
sum = sum + graph[num[i + 1]] - 2 * graph[num[i]];
}
}
return sum;
}
/**
* 把阿拉伯数字转换为罗马数字
* @param int number
* @return String
*/
public static String a2r(int number) {
String rNumber = "";
int[] aArray = {1000 , 900 , 500 , 400 , 100 , 90 , 50 , 40 , 10 , 9 , 5 , 4 , 1};
String[] rArray = {"M" , "CM" , "D" , "CD" , "C" , "XC" , "L" , "XL" , "X" ,
"IX" , "V" , "IV" , "I"};
if (number < 1 || number > 3999) {
rNumber = "-1";
} else {
for (int i = 0; i < aArray.length; i++) {
while (number >= aArray[i]) {
rNumber += rArray[i];
number -= aArray[i];
}
}
}
return rNumber;
}
}
3. 字符串 切割
1. ResultHandler.AIPredictResultHandler.java
/**
* @Author: menghuan
* @Date: 2021/10/20 17:19
*/
public class ResultHandler {
public static String AIPredictResultHandler(String var){
String substring = var.substring(var.indexOf("[") + 1, var.lastIndexOf("]"));
System.out.println(substring);
return substring;
}
public static void main(String[] args) {
String varR = "+I[26.004128914434695]";
AIPredictResultHandler(varR);
}
}
4. 获取随机数
4. 全局 · 常量的维护 ( 项目级 )
编程中使用常量的优点:
常量提取出来有利于代码阅读,而且下次再做这种判断不用手写或复制并且提高代码的复用率,方便修改,直接通过常量类就能得到。
不过我觉得提取出来并不会有利于代码性能提升,因为常量分配在内存的常亮池中,所以内存不会出现多个相同常量字符串。
总的来说提取常量主要是为了 :避免魔法数字和硬编码等,提高代码的可读性。
1. interface 接口
使用 interface 来定义一个接口。
接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。
定义接口的基本格式如下:
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
//全局常量
[public] [abstract] 方法;
//抽象方法
}
修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限。
接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。
extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。
方法:接口中的方法只有定义而没有被实现。
public abstract void eat(); //接口中只能定义抽象方法
void eat(); //接口中定义的方法没有声明修饰符,默认为 public abstract
public static final int NUM = 10; //在接口中定义一个常量
int NUM = 10; //常量
接口之间可以多继承(注意:类是只能单继承)
具体类实现接口必须实现接口的所有方法
接口的概念 :
1.接口是一组行为的规范、定义,没有实现(JDK1.8默认方法)
2.使用接口,可以让我们的程序更加利于变化
3.接口是面向对象编程体系中的思想精髓之一
4.面向对象设计法则:基于接口编程
接口的使用规则 :
(1)定义一个接口,使用 interface 关键字;
(2)在一个接口中,只能定义常量、抽象方法,JDK1.8 后可以定义默认的实现方法;
(3)接口可以继承多个接口,extends xxx,xxx;
(4)一个具体类实现接口使用 inplements 关键字;
(5)一个类可以实现多个接口;
(6)抽象实现接口可以不实现接口的方法;
(7)在接口中定义的方法没有声明访问修饰符,默认为 public;
(8)接口不能有构造方法;
(9)接口不能被实例化。
1. CommonConstants.java
public interface CommonConstants {
String TENANT_ID = "TENANT-ID";
String AUTHORIZATION = "Authorization";
String VERSION = "VERSION";
Integer TENANT_ID_1 = 1;
String STATUS_DEL = "1";
String STATUS_NORMAL = "0";
String STATUS_LOCK = "9";
String MENU = "0";
Integer MENU_TREE_ROOT_ID = 0;
String UTF8 = "UTF-8";
String FRONT_END_PROJECT = "iot-ui";
String BACK_END_PROJECT = "iot";
String DEFAULT_CODE_KEY = "DEFAULT_CODE_KEY_";
String IOT_PUBLIC_PARAM_KEY = "IOT_PUBLIC_PARAM_KEY";
Integer SUCCESS = 0;
Integer FAIL = 1;
String BUCKET_NAME = "iot";
String RESOURCE_NOT_EXIST = "相应资源不存在,请核实后操作";
String NAME_ALREADY_EXISTS = "名称已存在,请核实后操作";
String PAY_SUBJECT = "支付服务";
String REFUND_SUBJECT = "退款服务";
String MEETING_STATUS_CODE_0 = "0";
String MEETING_STATUS_CODE_1 = "1";
String MEETING_STATUS_CODE_2 = "2";
String MEETING_STATUS_CODE_3 = "3";
String MEETING_STATUS_CODE_4 = "4";
String MEETING_STATUS_CODE_5 = "5";
String MEETING_STATUS_CODE_6 = "6";
String MEETING_STATUS_CODE_7 = "7";
String MEETING_STATUS_CODE_8 = "8";
String MEETING_STATUS_CODE_9 = "9";
public interface PAY_TYPE {
String ALIPAY = "alipay";
String WECHATPAY = "wechat";
}
public interface Language {
String ZH = "0";
String EN = "1";
}
}
interface 里 interface 的应用
@Override
public Boolean deleteIotStructureModel(Integer id) {
String alipay = CommonConstants.PAY_TYPE.ALIPAY;
// 校验:资源是否存在
IotStructureModel iotStructureModel = baseMapper.selectById(id);
if (null == iotStructureModel) {
throw new IotAssetStructureException(CommonConstants.RESOURCE_NOT_EXIST);
}
// 业务逻辑
this.removeById(id);
return Boolean.TRUE;
}
2. enum
1. BusinessEnum.java
package com.linksame.iot.common.core.constant.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @Classname BusinessEnum
* @Description 业务枚举
* @Date 2019/11/11 10:11
* @Created by DZL
*/
@Getter
@AllArgsConstructor
public enum BusinessEnum {
/**
* 参数校验 101-199
*/
PARAMETER_NULL(101, "参数不能为空"),
ADD_FAIL(102, "新增失败"),
UPDATE_FAIL(103, "修改失败"),
DELETE_FAIL(104, "删除失败"),
REVIEW_FAIL(105, "审核失败"),
DATA_NULL(106, "获取数据为空"),
PARAMETER_ID_NULL(107, "参数ID不能为空"),
ILLEGAL_PARAMETER(108, "参数非法"),
SUBMIT_REPEAT(109, "点击太快了,请勿重复提交"),
QRCODE_NULL(110, "二维码生成为空"),
TOKEN_ILLEGAL(111, "Token传参错误!"),
/*授权枚举 200-998*/
AUTH_HEADER_FAIL(200, "请求头携带参数不符合规范!"),
AUTH_ACCOUNT_LOGIN_FAIL(201, "账号或密码输入错误!"),
/*国际化语言*/
LANGUAGE_NULL(999, "获取目标语言为空"),
/*菜单枚举 1001-1099*/
MENU_SAVE(1001, "非系统菜单不可新增"),
MENU_DELET(1002, "非系统菜单不可删除"),
MENU_UPDATE(1001, "非系统菜单不可修改"),
MENU(1099, "系统菜单"),
/*功能枚举 1101-1199*/
FUNCTION_DELET(1101, "该功能占用,无法删除!!!"),
BIND_NOT_DISABLE(1102,"存在关联业务, 无法禁用"),
/*角色枚举 1201-1299*/
ROLE_DELET(1201, "该角色已有用户占用,不允许删除"),
ROLE_CODE_IS_NOT_NULL(1202,"角色code不允许为空"),
ROLE_SYSTEM_PRESET_UPDATE(1203,"系统预置角色不允许修改"),
ROLE_SYSTEM_PRESET_DELETE(1204,"系统预置角色不允许删除"),
ROLE_SYSTEM_PRESET_DISABLE(1204,"系统预置角色不允许禁用"),
ROLE_NAME_EXISTS(1205,"角色名称已存在"),
ROLE_ID_NO_EXISTS(1205,"角色id不存在"),
CLIENT_ID_EXIST(1351, "终端编号已存在,请重新填写"),
SOCIAL_TYPE_EXIST(1361, "社交类型已存在,请选择其他类型"),
SOCIAL_NOT_EXIST(1362, "该微信的社交类型标识不存在"),
/* 账号/用户 2000-2099*/
USER_IS_LOCK(2000, "该账号已被锁定"),
USER_IS_EXIST(2001,"该账号已被注册,请重新输入"),
ADMIN_USER_NULL(2002,"未查询到匹配的账号信息"),
OLD_PASSWORD_IS_FAIL(2003,"原密码错误,修改失败"),
ADMIN_USERINFO_NULL(2004, "未查询到匹配的用户信息"),
ADMIN_TENANT_NULL(2005,"未查询到匹配的租户信息"),
TENANT_NOT_IS_NULL(2007,"租户ID不允许为空"),
USER_IDCODE_IS_EXIST(2008,"系统中已存在该身份证号, 请核对后再提交"),
USER_IDCODE_IS_ILLEGAL(2009,"身份证号不允许包含中文字符, 请确认后再提交"),
USER_ADD_MUST_ENTERED(2010,"新增正式用户必须录入账号信息"),
USER_PHONE_IS_ILLEGAL(2011,"手机号格式不规范,请重新输入"),
USER_PHONE_IS_EXIST(2012,"该手机号已被注册,请重新输入"),
USER_EMAIL_IS_ILLEGAL(2013,"邮箱格式不规范,请重新输入"),
USER_EMAIL_IS_EXIST(2014,"该邮箱已被注册,请重新输入"),
USER_RELATED_IS_EXIST(2015,"该用户信息存在关联数据, 不允许删除"),
USER_BINDING_IS_EXIST(2016,"该用户已有绑定账号, 绑定失败!"),
USERNAME_NOT_IS_NULL(2017,"账号名不允许为空"),
USERNAME_LENGTH_IS_FAIL(2018,"账号名长度不允许小于5位"),
PASSWORD_NOT_IS_NULL(2019,"密码不允许为空"),
PASSWORD_LENGTH_IS_FAIL(2020,"密码长度不允许小于6位"),
/* 租户 2100-2149*/
TENANT_RELATED_USER_IS_EXIST(2101,"该租户存在已关联的账号信息, 不允许删除"),
TENANT_SYSTEM_ERROR(2102,"不允许添加系统租户"),
TENANT_NAME_IS_EXIST(2103,"该租户名称已存在"),
TENANT_TYPE_IS_NULL(2104,"租户类型不允许为空"),
TENANT_IS_NULL(2105,"租户不允许为空"),
TENANT_IS_PENDING_REVIEW(2170, "该租户待审核"),
TENANT_IS_AUDIT_FAILED(2171, "该租户审核未通过"),
TENANT_IS_LOCK(2180, "该租户已被冻结"),
/* 角色 2150-2199*/
ROLE_IS_NULL(2150,"角色不允许为空"),
/* 人脸 2200-2299*/
FACE_ERROR(2200, "调用人脸接口错误"),
FACE_PATH_NULL(2201, "未查询到匹配的人脸信息"),
FACE_RELATED_IS_EXIST(2202,"人脸信息已存在关联关系, 请确认后再提交"),
FACE_RELATED_NOT_USERINFO(2203,"该人脸图片未关联用户信息"),
FACE_RELATED_NOT_BE_DELETE(2204,"该人脸存在关联数据, 不允许删除"),
/* 卡号 2300-2399*/
CARD_FIND_FAIL(2300, "查询卡号错误"),
CARD_FIND_NULL(2301, "未查询到匹配的卡号信息"),
CARD_BIND_REPEAT_NULL(2302, "卡号绑定重复或未绑定访客"),
CARD_BIND_EXIST(2303, "卡号已被绑定"),
CARD_BIND_FAIL(2304, "卡号绑定失败"),
CARD_RELATED_IS_EXIST(2305,"卡号信息已存在关联关系, 请确认后再提交"),
CARD_IS_ILLEGAL(2306,"卡号不允许包含中文字符, 请确认后再提交"),
CARD_RELATED_USERINFO_NULL(2307,"未查询到卡号关联的用户信息"),
CARD_IS_EXIST(2308,"卡号已存在, 请勿重复添加"),
CARD_RELATED_NOT_DELETE(2309,"卡号存在关联业务, 不允许删除"),
/* 车牌号 2400-2499*/
CAR_ADD_FAIL(2400, "存储车牌错误"),
CAR_PARAMETER_IS_NULL(2401, "车牌号参数为空,请输入车牌号"),
CAR_FIND_FAIL(2402, "查询车牌错误"),
CAR_FIND_NULL(2403,"未查询到匹配的车牌号信息"),
RELATED_IS_EXIST(2404,"存在关联业务, 不允许删除"),
CAR_RELATED_IS_EXIST(2405,"车牌号信息已存在关联关系, 请确认后再提交"),
CAR_USER_RELATED_NOT_EXIST(2406,"用户-车牌关联信息不存在"),
CAR_IS_EXIST(2407,"车牌号已存在, 请勿重复添加"),
CAR_RELATED_NOT_DELETE(2408,"车牌号存在关联业务, 不允许删除"),
/* 微信 2500-2599 */
WECHAT_FIND_NULL(2500,"未查询到匹配的微信数据"),
WECHAT_CODE_NULL(2501,"参数code不允许为空"),
WECHAT_SYSTEM_CONFIG_NULL(2502,"系统缺少微信app_id和app_secret配置"),
WECHAT_CALLBACK_NULL(2503,"获取微信响应报文为空"),
WECHAT_RELATED_NOT_DELETE(2504,"微信存在关联业务, 不允许删除"),
WECHAT_RELATED_NOT_BIND(2505,"该微信已被绑定, 请勿重复操作"),
/* 其他异常 2500-2599*/
USERID_NOT_IS_NULL(2500,"userInfoId参数不允许为空"),
ISBINDING_NOT_IS_NULL(2501,"isBinding参数不允许为空"),
MGS_CONFIG_FAIL(2599, "消息服务配置失败"),
VISITORS_OUTBOUND_NULL(5210, "当前外访申请未找到"),
VISITORS_OUTBOUND_REVIEW(5211, "当前外访申请暂停审核"),
VISITORS_OUTBOUND_DEP(5212, "外部预约需要选择外访部门"),
VISITORS_OUTBOUND_NUMS_EXCEED(5213, "预约人数已满"),
VISITORS_OUTBOUND_USER_FAIL(5214, "外访人员添加失败"),
VISITORS_OUTBOUND_CARNO_FAIL(5215, "车牌操作失败"),
VISITORS_OUTBOUND_FACE_FAIL(5216, "人脸操作失败"),
VISITORS_OUTBOUND_ENTRANCE_FAIL(5217, "调用设备人脸错误"),
VISITORS_OUTBOUND_TIME_EXCEED(5218, "预约开始时间与当前时间不得相差7天以上"),
VISITORS_INVITE_DETAIL_ADD(5230, "外部邀请详情新增失败"),
VISITORS_INVITE_COUNT(5231, "您已提交过外访申请,请勿重复提交"),
VISITORS_INVITE_NULL(5232, "未查询到内部邀请信息"),
VISITORS_INVITE_USER_NULL(5233, "邀请人信息不可用"),
VISITORS_INVITE_TIME_EXPIRED(5234, "邀请时间已到期,该邀请已失效"),
VISITORS_INVITE_DETAIL_ZERO(5235, "邀请人员暂时为空"),
VISITORS_INVITE_STATUS_EXIST(5236, "该邀请已提交"),
VISITORS_RECORDING_NOT_FOUND(5240, "外访记录不存在"),
VISITORS_RECORDING_NULL(5241, "外访记录获取为空"),
VISITORS_RECORDING_DETAIL_ADD(5242, "外访记录详情新增失败"),
PARKING_AREA_NO_EXIST(5300, "停车场编号已存在,请重新输入"),
PARKING_REGION_ADD_FAIL(5310, "停车场区域新增失败"),
PARKING_REGION_UPDATE_FAIL(5311, "停车场区域修改失败"),
PARKING_REGION_DELETE_FAIL(5312, "停车场区域删除失败"),
PARKING_REGION_SPACE_EXIST(5313, "该停车场区域下存在停车位,请先删除区域下的停车位"),
PARKING_SPACE_NO_ALREADY_EXIST(5320, "车位编号已存在,请重新输入"),
PARKING_SPACE_UPDATE_STATUS_FAIL(5321, "修改车位状态失败"),
PARKING_CAR_INOUT_ADD_FAIL(5331, "车辆进出新增失败"),
PARKING_CAR_INOUT_UPDATE_FAIL(5332, "车辆进出修改失败"),
PARKING_CAR_INOUT_NOT_FOUND(5333, "车辆进出信息未找到"),
PARKING_CAR_INOUT_ADD_DETAIL(5341, "车辆进出新增详情失败"),
PARKING_CAR_INOUT_UPDATE_DETAIL(5342, "车辆进出修改详情失败"),
PARKING_CAR_INOUT_DELETE_DETAIL(5343, "车辆进出删除详情失败"),
PARKING_ACCOUNT_ADD_FAIL(5350, "停车场关联计费失败"),
PARKING_ACCOUNT_EMPTY(5351, "计量项为空, 至少选择一项计量项"),
PARKING_ACCOUNT_FAIL(5352, "获取卡计费套餐失败"),
PARKING_ACCOUNT_FEIGN_FAIL(5354, "计算价格出错,请重试"),
PARKING_BILLING_EMPTY(5360, "缴费项为空"),
PARKING_BILLING_DATE_ILLEGAL(5361, "续费日期不应小于到期时间"),
PARKING_BILLING_UPDATE_FAIL(5362, "缴费失败"),
PARKING_BILLING_DETAIL_FAIL(5363, "新增计费详情记录失败"),
PARKING_BILLING_MONTH_NULL(5364, "缴费月份不能为空"),
PARKING_BILLING_MONTH_LEAST_MON(5365, "缴费月份至少为1个月"),
PARKING_BILLING_CAR_REPEAT(5366, "当前车牌已办理过该停车场会员,请重新输入"),
PARKING_BILLING_EXPIRETIME_BEFORE(5367, "到期时间不能小于开始时间或当前时间"),
PARKING_BILLING_CARD_NOT_FOUND(5368, "当前停车场不存在该卡,请重新选择"),
PARKING_PAY_LOG_ADD_FAIL(5370, "支付记录添加失败"),
PARKING_CARD_EMPTY(5350, "卡为空"),
PARKING_CARD_PRODUCT_EMPTY(5360, "卡套餐为空"),
/** Structure资产结构业务枚举 6000-6100 */
TENANT_ID_NULL(6000,"租户id不能为空"),
PROVINCE_ID_NULL(6001,"省市区id不能为空"),
TENANT_TYPE_EXCEPTION(6002,"租户类型应为平台租户,请核实后操作"),
PARAMETER_TRD_NOT_NULL(6003,"3D模型挂载类型不能为空"),
STRUCTURE_EXIST(6010,"该资产结构已存在,请核实后操作"),
STRUCTURE_NO_EXIST(6011,"资产结构节点不存在,请核实后操作"),
STRUCTURE_NAME_EXIST(6012,"该名称已存在,请核实后操作"),
STRUCTURE_NAME_NO_EXIST(6013,"该名称不存在,请核实后操作"),
STRUCTURE_ANCHORS_INFO_EXIST(6014,"当前资产结构节点存在锚点信息,请核实后操作"),
STRUCTURE_LIST_EXCEPTION(6015,"资产结构List列表数据异常:当前无数据"),
STRUCTURE_PATH_EXCEPTION(6016,"该资产结构路劲异常,请核实后操作"),
STRUCTURE_NODE_BE_OCCUPIED(6017,"该资产结构节点已被占用,请核实后操作"),
PARENT_NODE_EXCEPTION(6030,"父级节点数据异常"),
CHILDREN_NODE_EXCEPTION(6031,"子级节点数据异常"),
CHILDREN_NODE_EXIST(6032,"当前节点存在子节点,请核实后操作"),
ANCHORS_EXIST(6040,"存在锚点信息,请核实后操作"),
ANCHORS_NO_EXIST(6041,"存在锚点信息,请核实后操作"),
ANCHORS_TYPE_LIMIT(6042,"锚点Type参数为0或1,请核实后操作"),
ANCHORS_TYPE_OR_MACHINE_NULL(6043,"锚点Type或machineId为空,请核实后操作"),
/** Meeting智慧会议业务枚举 6100-6200 */
MEETING_ACTIVITY_NULL(6120,"会议室审批资源不存在,请核实后操作"),
MEETING_ACTIVITY_REVIEW(6121,"会议室资源未审核,请核实后操作"),
/** 7000-7099 支付业务枚举*/
PAY_FAIL(7000, "支付失败"),
/** 7100 - 7199 消息枚举 */
WEBPUSH_PRODUCT_LIST_NULL(7100,"产品套餐为空"),
WEBPUSH_ORDER_NULL(7101,"订单为空"),
WEBPUSH_ORDER_ADD_FAIL(7102,"订单创建失败"),
WEBPUSH_ORDER_DETAIL_NULL(7110,"订单详情为空"),
WEBPUSH_ORDER_DETAIL_ADD_FAIL(7111,"订单详情创建失败"),
WEBPUSH_RECHARGE_TOP_FAIL(7120,"充值失败"),
/**JSON合并 9999**/
JSON_Empty(9900,"json数据为空"),
JSON_WRONG_FORMAT(9901,"json格式有误"),
JSON_MERGE(9902,"(TF文件)JSON数据合并失败"),
JSON_CONVERT_FAIL(9903,"JSON转换失败"),
/* BIM */
BIM_SERVER_ERROR(11180, "BimServer服务器未知错误"),
BIM_IO_FAIL(11181, "BIM IO流错误"),
BIM_CHECK_FAIL(11182, "ifc 上传文件失败"),
BIM_DESERIALIZER_FAIL(11183, "反序列化器失败"),
ACTIVITI_MODEL_NULL(13100, "模型图未找到,请添加并保存模型图"),
ACTIVITI_MODEL_NAME_EXIST(13101, "模型名称已存在、请重新输入"),
ACTIVITI_MODEL_KEY_EXIST(13102, "模型KEY已存在、请重新输入"),
ACTIVITI_MODEL_MGS_ADD_FAIL(13103, "消息服务关联模型失败"),
ACTIVITI_MODEL_MGS_DELETE_FAIL(13103, "删除消息服务关联模型失败"),
ACTIVITI_PROCESS_START(13200, "流程实例挂起失败"),
ACTIVITI_PROCESS_TASK_ALERADY(13201, "该流程实例下存在待办任务"),
/* 应用设置 15000-15200 */
APP_CLASSIFY_NAME_REPEAT(15000,"应用分类名称已存在"),
APP_CLASSIFY_BINDING_ERROR(15001,"该分类已关联应用,请先解除应用关联"),
APP_ACTIVERULE_REPEAT(15002,"应用路由已存在"),
pass_platform_REPEAT(15003,"已配置用户信息,不可重复提交"),
APP_NAME_FALE(15004,"应用名称已存在"),
APP_NOT_FOUND(15005,"应用不存在");
/**
* 错误编码
*/
private int code;
/**
* 描述
*/
private String description;
}
2. StructureEnumConstants.java
package com.linksame.iot.asset.structure.cache;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @Author: menghuan
* @Date: 2021/12/7 10:39
*/
@Getter
@AllArgsConstructor
public enum StructureEnumConstants {
STRUCTURE_MACHINE_STRUCTURE(10001,"structure_machine_structure","空间结构:设备与空间结构关系"),
STRUCTURE_MACHINE_TENANT(10002,"structure_machine_tenant","空间结构:设备与租户关系"),
MACHINE_ID(10003,"machine_id","设备ID:"),
PARAM_ID(10004,"param_id","参数ID:"),
STRUCTURE_ID(10005,"structureId","空间结构ID"),
TENANT_ID(10006,"tenantId","租户ID"),
NAME(10007,"name","名称"),
STATUS(10008,"status","状态"),
PRO_TYPE(10009,"proType","产品类型"),
PRO_ID(10010,"proId","产品ID"),
STATUS_ZERO(20000,"0","零"),
STATUS_ONE(20001,"1","一"),
STATUS_TWO(20002,"2","二"),
STATUS_THREE(20003,"3","三"),
STATUS_FOUR(20004,"4","四"),
STATUS_FIVE(20005,"5","五"),
TRD_PARAMETER_NOT_NULL(30001, "3D","3D模型挂载类型不能为空"),
END_LABEL(9000,"end_label","结束标签");
/** 错误编码 */
private int code;
/** KEY */
private String key;
/** 描述 */
private String description;
}
3. Class 定义常量
采用 “类.常量名" 方法进行调用。
需要私有化构造方法,避免创建该类的实例。同时不需让其他类继承该类。
如果多处需要访问工具类中定义的常量,可以通过静态导入(static import)机制,避免用类名来修饰常量名。
普通类中可以通过提供 get() 的方法来提供调用。
public final class ClazConstants {
//私有构造方法
private ClazConstants(){}
public static final int ConstantA = 100;
public static final int ConstantB = 200;
}
interface 中定义常量方法生成的 class 文件比第一种方法的 class 文件更小,且代码更简洁,效率更高。
4. interface 里定义 interface ( 为了减少接口的定义 , 同时将常量分类 )
示例:
public interface ConstantUtil {
interface Status {
int STATE_DISPLAY = 1;
int STATE_HIDDEN = 2;
int STATE_DELETED = 3;
}
interface SequenceName {
String MOUDLE_SEQUENCE = "intpub_moudle";
String MENU_SEQUENCE = "intpub_menu";
String INFO_SEQUENCE = "intpub_info";
String MOUDLE_PART_SEQUENCE = "intpub_moudle_part";
String PART_SEQUENCE = "intpub_part";
String ROLE_SEQUENCE = "intpub_role";
String USER_SEQUENCE = "intpub_user";
String MENU_ROLE_SEQUENCE = "intpub_menu_role";
}
interface HtmlUrl{
String HTML_URL="E:/onlineExam/project/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/IntpubWeb";
}
}
interface 里定义 interface 的意义:
1、为了减少接口的定义,同时将常量分类 ( 分组 )
5. 常量和枚举的区别
常量中存在的缺点 :
①常量作为参数时,是String,int 等弱类型,开发员传入没有在常量接口里定义的值,这个问题无法通过编译器发现 ;
②由于开发员可以直接写常量值,所以不能用对比,只能用 equals() 对比,不能优化性能;
③编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译所有引用常量的类因为里面存的是旧值。
枚举的优点 :
①私有构造函数,避免被继承和扩展;
②定义方法的参数时,必须用枚举常量类类型;
③常量值地址唯一,可以用直接对比,性能会有提高;
④编译时,没有把常量值编译到代码里,即使常量的值发生变化也不会影响引用常量的类;
根据以上的优缺对比,显然得知枚举的方式更适合项目中使用。
但是就以通常的写法来看,枚举的方式是最繁琐的,编程上不够简便。
所以综上所述,如果就便捷而言推荐使用 Class 的方式定义常量,若就性能和安全性来说推荐使用枚举的方式定义常量。