资讯专栏INFORMATION COLUMN

WMS系统异常体系结构

cppowboy / 2537人阅读

摘要:故其承载的功能主要是多语异常列表。多语系统的异常按业务功能区分,每个业务功能一个,下面以数据导入为例进行说明。多语包异常消息构造体其方法即多语支持,在方法中进行语言判断。

WMS系统异常体系结构 前言

WMS系统的异常均继承自RuntimeException, 主要作用于业务处理中异常信息的收集。故其承载的功能主要是 1.多语 2.异常列表。下面就以这两个功能分别进行描述。

多语

WMS系统的异常按业务功能区分,每个业务功能一个,下面以数据导入为例进行说明。

public class DataImportException extends BizException {
    private static final long serialVersionUID = 1L;
    
    //多语包
    private static ResourceBundle resourceBundle = ResourceBundle.getBundle("exceptionConfig-import", locale);
    private static ResourceBundle usEnResourceBundle = ResourceBundle.getBundle("exceptionConfig-import", usLocale);

    //异常消息CODE
    public static final String ERR_IMPORT_METADATA_ORG_NOT_UNIQUE = "ERR_IMPORT_METADATA_ORG_NOT_UNIQUE"; 
    public static final String ERR_TALLYHEADER_EXIST = "ERR_TALLYHEADER_EXIST";

    //构造体
    public DataImportException(String code, String... values) {
        super(code, getMessage(code), values);
    }
    public static String getMessage(@NotNull String key) {
        switch (WmsStatic.getLanguage()) {
            case ZH : return getCnMessage(key);
            case EN : return getEnMessage(key);
            default : return getCnMessage(key);
        }
    }
    private static String getCnMessage(String key) {
        try {
            return resourceBundle.getString(key);
        } catch (MissingResourceException e) {
            logger.warn("DataImportException: " + key + "CN no named");
            return NO_NAMED_EXCEPTION;
        }
    }
    private static String getEnMessage(String key) {
        try {
            return usEnResourceBundle.getString(key);
        } catch (MissingResourceException e) {
            logger.warn("DataImportException: " + key + "EN no named");
            return getCnMessage(key);
        }
    }

其getMessage方法即多语支持,在方法中进行语言判断。

异常列表

在BizException中,维护了一个列表,用于对多个异常信息的保存。

public class BizException extends GeniDcException {
  private List errorList = new ArrayList();
  //按values顺序替换message中的[]
  public BizException(String code, String message, String... values) {
        ClientMessage clientMessage = new ClientMessage();
        clientMessage.setCode(code);
        String msg = null;
        if ((NO_NAMED_EXCEPTION.equalsIgnoreCase(message)) && values.length > 0) {
            msg = values[0];
        } else {
            msg = parseMessage(message, values);
        }
        clientMessage.setMessage(msg);
        clientMessage.setMessageCN(msg);
        this.errorList.add(clientMessage);
        // 统一记录下错误信息
        logger.info(this.toString());
    }
    //无须替换
    public BizException(Long id, String code, String message) {
        ClientMessage clientMessage = new ClientMessage();
        clientMessage.setId(id);
        clientMessage.setCode(code);
        clientMessage.setMessage(message);
        clientMessage.setMessageCN(message);
        this.errorList.add(clientMessage);
        // 统一记录下错误信息
        logger.info(this.toString());
    }
    //将map的值替换message中的[]
    public BizException(Long id, String code, @NotNull String message, Map map) {
        ClientMessage clientMessage = new ClientMessage();
        clientMessage.setId(id);
        clientMessage.setCode(code);
        clientMessage.setContent(map);
        clientMessage.setMessage(message);
        clientMessage.setMessageCN(parseMessageFromMap(code, message, map));
        this.errorList.add(clientMessage);

        // 统一记录下错误信息
        logger.info(this.toString());

    }
    private static String parseMessage(String message, @NotNull String... values) {
        if (values.length == 0) {
            return message;
        }
        message = message.replaceAll("[", "{").replaceAll("]", "}");
        Pattern pattern = Pattern.compile("{(.*?)}");
        Matcher matcher;
        for (String value : values) {
            matcher = pattern.matcher(message);
            value = Matcher.quoteReplacement(value);
            message = matcher.replaceFirst("[" + value + "]");
        }
        return message;
    }
    public BizException(@NotNull List errorList) {
        this.errorList.addAll(errorList);
    }
    private String parseMessageFromMap(String expCode, @NotNull String message, @Nullable Map map) {
        String[] splits = message.split("[");
        if (splits.length > 0) {
            for (int i = 0; i < splits.length; i++) {
                if (splits[i].indexOf("]") > 0) {
                    String mapKey = splits[i].substring(0, splits[i].indexOf("]"));
                    String mepValue = "";
                    if (map == null) {
                        mepValue = "[]";
                    } else if (map.containsKey(mapKey)) {
                        mepValue = "[" + String.valueOf(map.get(mapKey)) + "]";
                    } else {
                        logger.warn("when throw exception[" + expCode + "], you hadn"t set key [" + mapKey + "] and value into map ");
                    }
                    // replaceAll之前, 对特殊字符的处理
                    mepValue = Matcher.quoteReplacement(mepValue);
                    message = message.replaceAll("[" + mapKey + "]", mepValue);
                }
            }
            return message;
        } else {
            return message;
        }
    }
    
}

最终,Exception对象成了维护异常信息的容器。

结构图


总的来说, BizExcetion 维护了异常信息列表,DataImportException 支持了多语

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70736.html

相关文章

  • WMS项目中使用到的切面

    摘要:前言目前系统刚启动,骨架刚刚搭建完成,在项目中,使用了一些切面,做一些业务无关的处理。在现在的项目里面,分别在,调用,分页,处理,均使用到了切面。希望本文的阅读者也不吝将项目中使用的切面分享出来。 前言 目前系统刚启动,骨架刚刚搭建完成,在项目中,使用了一些切面,做一些业务无关的处理。在本文中,将各个切面例举出来,用以加深自己对切面的理解。记得在初学切面的时候,一般文章介绍切面的时候,...

    Tikitoo 评论0 收藏0
  • Android之Window和弹窗问题

    摘要:指向的主要是实现和通信的。子不能单独存在,需附属特定的父。系统需申明权限才能创建。和类似,同样是通过来实现。将添加到中显示。方法完成的显示。执行的检查参数等设置检查将保存到中将保存到中。因为通过和的将无法获取到从而导致失败。 目录介绍 10.0.0.1 Window是什么?如何通过WindowManager添加Window(代码实现)?WindowManager的主要功能是什么? 1...

    Lorry_Lu 评论0 收藏0
  • Linux服务器中搭建 Java / Postgres / Tomcat / Ngnix 环境 +

    摘要:生产环境服务器环境搭建安装安装在系统中通过以下命令输入查看是否安装正确,输出如下创建发布目录,并给出相应的权限服务器和后台文件夹上传前端文件夹改变文件所有权文件的所有权变为加入参数,文件夹以及文件夹里的所有 生产环境服务器环境搭建 安装jdk 安装 openjdk-8-jdk 在 ubuntu-16.04 系统中通过以下命令: 1.sudo add-apt-repository pp...

    evin2016 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<