【实际开发12】- Utils / tools

本文详细介绍了Java中自定义工具类的构建方式,包括静态方法的使用,以及接口和枚举在常量维护中的应用。还讨论了泛型类中获取属性和时间格式校验的方法,以及罗马数字和阿拉伯数字的转换。此外,文章还提到了字符串切割和随机数生成的相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 自定义工具类 概念 / 解析

1. 构建方式

1. XxxClassl 类 public xxx() → new XxxClass()

2. XxxClassl 类 public static xxx() → XxxClass.xxx()

2. Interface

1. public interface XxxMapper → private final XxxMapper

2. public interface IXxxService → private final IXxxService

3. 获取任意泛型类的某个属性

2. 自定义工具类注意事项 ( 踩坑 )

1. 待定

3. 通用工具类

1. 时间 : 入参格式校验

0. LocalDateTime 用法 - 详参 : LocalDateTime用法_微风粼粼的博客-CSDN博客

1. format.parse() - Java 8 新添 API 用于 : 解析日期 和 时间

2. LocalDateTime.parse(date , dtf);

3. LocalDateTime - 实体类层直接拦截 , 未进入 Impl 业务层

4. LocalDateTime 局部格式化

2. 罗马数字 与 阿拉伯数字 互转

1. RomeToArabic.java

3. 字符串 切割

1. ResultHandler.AIPredictResultHandler.java

4. 获取随机数

4. 全局 · 常量的维护 ( 项目级 )

1. interface 接口

1. CommonConstants.java

2. enum

1. BusinessEnum.java

2. StructureEnumConstants.java

3. Class 定义常量

4. interface 里定义 interface ( 为了减少接口的定义 , 同时将常量分类 )

5. 常量和枚举的区别


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 的方式定义常量,若就性能和安全性来说推荐使用枚举的方式定义常量。

ERROR: please fix package/tp_package/lte/Makefile - see logs/package/tp_package/lte/dump.txt for details ERROR: please fix package/tp_package/lib/libsdm/Makefile - see logs/package/tp_package/lib/libsdm/dump.txt for details Collecting package info: done AMS: buildams.config and ams.config updated from local nvmp_artifact make[1]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp' TOOLS_BACKUP_OPEN, TOOLS_BACKUP_FILE_NOT_EXISTED, TOOLS_COMPILE. make[2]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp' + mkdir -p /home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1 + cd /home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1 + mkdir -p bin lib include stamp mkdir -p /home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/target-mips-openwrt-linux-uclibc-c510wv1/stamp touch /home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/.prepared + mkdir -p /home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host + cd /home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host + mkdir -p bin lib include stamp mkdir -p /home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/stamp /home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/include/sys install -m0644 /home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/include/*.h /home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/include/ install -m0644 /home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/include/sys/*.h /home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/include/sys/ ln -sf lib /home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/lib64 touch /home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/.prepared make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/m4' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/m4' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/m4' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/m4' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/sed' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/sed' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/sed' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/sed' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/autoconf' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/autoconf' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/autoconf' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/autoconf' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/pkg-config' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/pkg-config' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/pkg-config' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/pkg-config' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/xz' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/xz' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/xz' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/xz' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/automake' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/automake' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/automake' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/automake' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/missing-macros' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/missing-macros' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/missing-macros' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/missing-macros' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/libtool' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/libtool' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/libtool' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/libtool' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/flex' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/flex' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/flex' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/flex' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/bison' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/bison' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/bison' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/bison' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/mklibs' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/mklibs' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/mklibs' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/mklibs' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/sstrip' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/sstrip' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/sstrip' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/sstrip' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/ipkg-utils' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/ipkg-utils' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/ipkg-utils' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/ipkg-utils' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/genext2fs' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/genext2fs' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/genext2fs' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/genext2fs' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/e2fsprogs' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/e2fsprogs' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/e2fsprogs' make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/e2fsprogs' make[3]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/mtd-utils' make -C /home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5/lib CFLAGS="-O2 -I/home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/include -I/home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/include/e2fsprogs -fgnu89-inline -I/home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5/include -L/home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5 -L/home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/lib -DNO_NATIVE_SUPPORT" LDFLAGS="-L/home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/lib " WITHOUT_LZO=1 WITHOUT_XATTR=1 LZMA_STATIC_LIB="/home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/lib/liblzma.a" SUBDIRS="" BUILDDIR="/home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5" TARGETS="libmtd.a libcrc32.a" LIBS="libmtd libcrc32" make[4]: Entering directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5/lib' mkdir -p /home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5/ gcc -I../include -D_FILE_OFFSET_BITS=64 -O2 -I/home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/include -I/home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/include/e2fsprogs -fgnu89-inline -I/home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5/include -L/home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5 -L/home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/host/lib -DNO_NATIVE_SUPPORT -c -o /home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5/libmtd.o libmtd.c -g -Wp,-MD,/home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5/.libmtd.c.dep libmtd.c: In function 'dev_node2num': libmtd.c:444:10: error: called object 'major' is not a function or function pointer 444 | major = major(st.st_rdev); | ^~~~~ libmtd.c:432:9: note: declared here 432 | int i, major, minor; | ^~~~~ libmtd.c:445:10: error: called object 'minor' is not a function or function pointer 445 | minor = minor(st.st_rdev); | ^~~~~ libmtd.c:432:16: note: declared here 432 | int i, major, minor; | ^~~~~ libmtd.c: In function 'mtd_get_dev_info1': libmtd.c:741:46: warning: passing argument 3 of 'dev_read_data' discards 'const' qualifier from pointer target type [-Wdiscarded-array-qualifiers] 741 | ret = dev_read_data(lib->mtd_name, mtd_num, &mtd->name, | ^~~~~~~~~~ libmtd.c:182:63: note: expected 'void *' but argument is of type 'const char (*)[128]' 182 | static int dev_read_data(const char *patt, int mtd_num, void *buf, int buf_len) | ~~~~~~^~~ libmtd.c:747:46: warning: passing argument 3 of 'dev_read_data' discards 'const' qualifier from pointer target type [-Wdiscarded-array-qualifiers] 747 | ret = dev_read_data(lib->mtd_type, mtd_num, &mtd->type_str, | ^~~~~~~~~~~~~~ libmtd.c:182:63: note: expected 'void *' but argument is of type 'const char (*)[65]' 182 | static int dev_read_data(const char *patt, int mtd_num, void *buf, int buf_len) | ~~~~~~^~~ libmtd.c: In function 'mtd_probe_node': libmtd.c:1320:10: error: called object 'major' is not a function or function pointer 1320 | major = major(st.st_rdev); | ^~~~~ libmtd.c:1308:9: note: declared here 1308 | int i, major, minor; | ^~~~~ libmtd.c:1321:10: error: called object 'minor' is not a function or function pointer 1321 | minor = minor(st.st_rdev); | ^~~~~ libmtd.c:1308:16: note: declared here 1308 | int i, major, minor; | ^~~~~ make[4]: *** [../common.mk:63: /home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5/libmtd.o] Error 1 make[4]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5/lib' make[3]: *** [Makefile:69: /home/wuyilun/Desktop/NVMP/NVMP/nvmp/build_dir/host/mtd-utils-1.4.5/.built] Error 2 make[3]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp/tools/mtd-utils' make[2]: *** [tools/Makefile:237: tools/mtd-utils/compile] Error 2 make[2]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp' make[1]: *** [tools/Makefile:201: /home/wuyilun/Desktop/NVMP/NVMP/nvmp/staging_dir/target-mips-openwrt-linux-uclibc-c510wv1/stamp/.tools_install_nnnnn] Error 2 make[1]: Leaving directory '/home/wuyilun/Desktop/NVMP/NVMP/nvmp' make: *** [/home/wuyilun/Desktop/NVMP/NVMP/nvmp/include/toplevel.mk:279: world] Error 2
最新发布
08-19
(noposplat) [guoshangwei5@localhost diff-gaussian-rasterization]$ python setup.py install running install /data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/cmd.py:90: SetuptoolsDeprecationWarning: setup.py install is deprecated. !! ******************************************************************************** Please avoid running ``setup.py`` directly. Instead, use pypa/build, pypa/installer or other standards-based tools. See https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html for details. ******************************************************************************** !! self.initialize_options() /data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/cmd.py:90: EasyInstallDeprecationWarning: easy_install command is deprecated. !! ******************************************************************************** Please avoid running ``setup.py`` and ``easy_install``. Instead, use pypa/build, pypa/installer or other standards-based tools. See https://github.com/pypa/setuptools/issues/917 for details. ******************************************************************************** !! self.initialize_options() running bdist_egg running egg_info writing diff_gaussian_rasterization.egg-info/PKG-INFO writing dependency_links to diff_gaussian_rasterization.egg-info/dependency_links.txt writing top-level names to diff_gaussian_rasterization.egg-info/top_level.txt /data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/torch/utils/cpp_extension.py:502: UserWarning: Attempted to use ninja as the BuildExtension backend but we could not find ninja.. Falling back to using the slow distutils backend. warnings.warn(msg.format('we could not find ninja.')) reading manifest file 'diff_gaussian_rasterization.egg-info/SOURCES.txt' adding license file 'LICENSE.md' writing manifest file 'diff_gaussian_rasterization.egg-info/SOURCES.txt' installing library code to build/bdist.linux-x86_64/egg running install_lib running build_py copying diff_gaussian_rasterization/__init__.py -> build/lib.linux-x86_64-cpython-310/diff_gaussian_rasterization running build_ext Traceback (most recent call last): File "/data/data1/work_folder/guoshangwei5/software/NoPoSplat/diff-gaussian-rasterization/setup.py", line 17, in <module> setup( File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/__init__.py", line 117, in setup return distutils.core.setup(**attrs) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/core.py", line 186, in setup return run_commands(dist) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/core.py", line 202, in run_commands dist.run_commands() File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 1002, in run_commands self.run_command(cmd) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/dist.py", line 1104, in run_command super().run_command(command) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 1021, in run_command cmd_obj.run() File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/command/install.py", line 109, in run self.do_egg_install() File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/command/install.py", line 167, in do_egg_install self.run_command('bdist_egg') File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/cmd.py", line 357, in run_command self.distribution.run_command(command) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/dist.py", line 1104, in run_command super().run_command(command) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 1021, in run_command cmd_obj.run() File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/command/bdist_egg.py", line 177, in run cmd = self.call_command('install_lib', warn_dir=False) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/command/bdist_egg.py", line 163, in call_command self.run_command(cmdname) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/cmd.py", line 357, in run_command self.distribution.run_command(command) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/dist.py", line 1104, in run_command super().run_command(command) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 1021, in run_command cmd_obj.run() File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/command/install_lib.py", line 19, in run self.build() File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/command/install_lib.py", line 113, in build self.run_command('build_ext') File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/cmd.py", line 357, in run_command self.distribution.run_command(command) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/dist.py", line 1104, in run_command super().run_command(command) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 1021, in run_command cmd_obj.run() File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/command/build_ext.py", line 99, in run _build_ext.run(self) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/setuptools/_distutils/command/build_ext.py", line 368, in run self.build_extensions() File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/torch/utils/cpp_extension.py", line 525, in build_extensions _check_cuda_version(compiler_name, compiler_version) File "/data/data1/work_folder/guoshangwei5/miniconda3/envs/noposplat/lib/python3.10/site-packages/torch/utils/cpp_extension.py", line 413, in _check_cuda_version raise RuntimeError(CUDA_MISMATCH_MESSAGE.format(cuda_str_version, torch.version.cuda)) RuntimeError: The detected CUDA version (12.3) mismatches the version that was used to compile PyTorch (11.8). Please make sure to use the same CUDA versions.
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值