对象存在性检测集中管理

在大型业务系统中, 常常需要从数据库中查询某个实体对象。 在进行处理之前, 必须先检测该实体是否存在,以增强系统的健壮性。 不过, 检测代码充斥在主业务流程中又会大大降低业务逻辑的清晰性, 最好集中起来进行管理。 因此,编写了一个类来做这个事情, 只需要一行调用就可以完成相应实体对象的检测。

美中不足的一点是, 打 log 的位置发生变化了。由于打 log 的主要目标是为了便于调试和定位错误位置, 为了补偿, 一种办法是调用方法时根据具体语境传入自定义的错误消息, 根据错误消息可以定位错误位置; 另一种办法是, 如果不希望每次调用都使用不同的自定义错误消息, 使用 log.error("error", bizEx) 打印异常栈信息, 也可以获取到抛出错误的位置。

NOTE: 为了遵循公司代码的保密性, 隐去导入的包名, 各位读者可以借鉴其思想, 运用到自己的项目中去。

使用方法:

import static util.CheckEntityExistManager.checkEntity;
import util.CheckEntityExistManager.EntityChecker;

public class EntityExistCheckTester {

    private static final Log log = LogFactory.getLog(EntityExistCheckTester.class);

    public static void main(String[] args) throws BizException {
        demo();
        demo2();
    }

    public static ResultSet demo() {

        try {
            // Not Need type casting
            DeviceDO device = checkEntity(EntityChecker.DISK_ID_CHECK, "d-xxx");
            System.out.println(device);
            VmDO vm = checkEntity(EntityChecker.VM_NAME_CHECK, "vm-name","user-defined msg: vm not exist when creating");
            System.out.println(vm);
            return new ResultSet(IErrorCode.SUCCESSFUL);
        } catch (BizException bizEx) {
            log.error("error", bizEx);
            return new ResultSet(bizEx.getErrorCode());
        } catch (Exception ex) {
            log.error(ex);
            return new ResultSet(IErrorCode.FAILED);
        }
    }

    public static ResultSet demo2() {
        try {
            ZoneDO zone = checkEntity(EntityChecker.ZONE_ID_CHECK, "z-yy");
            System.out.println(zone);
            return new ResultSet(IErrorCode.SUCCESSFUL);
        } catch (BizException bizEx) {
            log.error("error", bizEx);
            return new ResultSet(bizEx.getErrorCode());
        } catch (Exception ex) {
            log.error(ex);
            return new ResultSet(IErrorCode.FAILED);
        }
    }

}

实体存在性集中检测类: CheckEntityExistManager:
public class CheckEntityExistManager {

    private static final Log log = LogFactory.getLog(CheckEntityExistManager.class);

    private static CheckEntityExistManager checkEntityMgr = getInstance();

    private CheckEntityExistManager() {
    }

    private static CheckEntityExistManager getInstance() {
        if (checkEntityMgr == null) {
            checkEntityMgr = new CheckEntityExistManager();
        }
        return checkEntityMgr;
    }

    interface ICheckEntityExist<T> {
        T checkEntityExist(String entityValue, String msg) throws BizException;
    }

    private static ICheckEntityExist<DeviceDO> diskIdChecker = checkEntityMgr.new CheckDiskIdExist();
    private static ICheckEntityExist<VmDO> vmNameChecker = checkEntityMgr.new CheckVmExist();
    private static ICheckEntityExist<ZoneDO> zoneChecker = checkEntityMgr.new CheckZoneExist();

    public enum EntityChecker {
        DISK_ID_CHECK(diskIdChecker, DeviceErrorCode.DISK_NOT_EXIST),
        VM_NAME_CHECK(vmNameChecker, VmErrorCode.ERROR_VM_NOT_EXIST),
        ZONE_ID_CHECK(zoneChecker, ZoneErrorCode.ZONE_NOT_EXIST);

        EntityChecker(ICheckEntityExist<?> entityChecker, IErrorCode errorCode) {
            this.entityChecker = entityChecker;
            this.errorCode = errorCode;
        }

        private static Map<String, IErrorCode> errorMap = new HashMap<String, IErrorCode>();

        static {
            for (EntityChecker entityChecker: EntityChecker.values()) {
                ICheckEntityExist<?> checker = entityChecker.getEntityChecker();
                errorMap.put(checker.getClass().getSimpleName(), entityChecker.getErrorCode());
            }
        }

        private static IErrorCode getErrorCode(String checkClassSimpleName) {
            return errorMap.get(checkClassSimpleName);
        }

        private ICheckEntityExist<?> entityChecker;
        private IErrorCode errorCode;

        public ICheckEntityExist<?> getEntityChecker() {
            return entityChecker;
        }
        public void setEntityChecker(ICheckEntityExist<?> entityChecker) {
            this.entityChecker = entityChecker;
        }

        public IErrorCode getErrorCode() {
            return errorCode;
        }

        public void setErrorCode(IErrorCode errorCode) {
            this.errorCode = errorCode;
        }

    }

    @Autowired
    private DeviceService deviceService;

    @Autowired
    private VmService vmService;

    @Autowired
    private ZoneService zoneService;

    class CheckDiskIdExist implements ICheckEntityExist<DeviceDO> {

        @Override
        public DeviceDO checkEntityExist(String diskId, String msg) throws BizException {
            IErrorCode errorCode = EntityChecker.getErrorCode(CheckDiskIdExist.class.getSimpleName());
            String message = (msg == null ? errorCode.getMessage() : msg);
            //DeviceDO dev = deviceService.getDevice(diskId);
            DeviceDO dev = new DeviceDO();
            return CheckEntityExistManager.throwexOrReturn(dev, message, errorCode);
        }

    }

    class CheckVmExist implements ICheckEntityExist<VmDO> {

        @Override
        public VmDO checkEntityExist(String vmName, String msg) throws BizException {
            IErrorCode errorCode = EntityChecker.getErrorCode(CheckVmExist.class.getSimpleName());
            String message = (msg == null ? errorCode.getMessage() : msg);
            //VmDO vm = vmService.queryVmByName(vmName);
            VmDO vm = null;
            return CheckEntityExistManager.throwexOrReturn(vm, message, errorCode);
        }

    }

    class CheckZoneExist implements ICheckEntityExist<ZoneDO> {

        @Override
        public ZoneDO checkEntityExist(String zoneId, String msg) throws BizException {
            IErrorCode errorCode = EntityChecker.getErrorCode(CheckZoneExist.class.getSimpleName());
            String message = (msg == null ? errorCode.getMessage() : msg);
            //ZoneDO zone = zoneService.queryZoneById(zoneId);
            ZoneDO zone = null;
            return CheckEntityExistManager.throwexOrReturn(zone, message, errorCode);
        }

    }

    public static <T> T throwexOrReturn(T entity, String message, IErrorCode errorCode)
                                                        throws BizException {
        if (entity == null) {
            log.error(message);
            throw new BizException(errorCode);
        }
        return entity;
    }

    public static <T> T checkEntity(EntityChecker entityChecker, String entityValue, String customMsg) throws BizException {
        ICheckEntityExist<T> checker = (ICheckEntityExist<T>) entityChecker.getEntityChecker();
        return checker.checkEntityExist(entityValue, customMsg);

    }

    public static <T> T checkEntity(EntityChecker entityChecker, String entityValue) throws BizException {
        ICheckEntityExist<T> checker = (ICheckEntityExist<T>) entityChecker.getEntityChecker();
        return checker.checkEntityExist(entityValue, null);
    }

}
时间: 2024-08-25 02:43:09

对象存在性检测集中管理的相关文章

BOM之navigator对象和用户代理检测

前面的话 navigator对象现在已经成为识别客户端浏览器的事实标准,navigator对象是所有支持javascript的浏览器所共有的.本文将详细介绍navigator对象和用户代理检测 属性 与其他BOM对象的情况一样,每个浏览器中的navigator对象也都有一套自己的属性.下表列出了存在于所有浏览器中的属性和方法,以及支持它们的浏览器版本 属性 说明 appCodeName 浏览器名称[所有浏览器都返回Mozilla] userAgent 浏览器的用户代理字符串 appVersion

射线和平面的相交性检测

[射线和平面的相交性检测] 对于射线:p(t)=p0+t*d,与平面p*n=d.如何知道此射线与平面是否相交?如果相交,如何求出交点? 1.求是否相交. 首先判断点是否在平面上,将点坐标代入平面公式计算即可得. 当d*n =0时,射线与平面平行,无交点. 当d*n <0时,射线射向与平面相反的方向,无交点. 综上,d*n  <=0时,射线与平面无交点. 2.相交时,交点坐标是什么? 利用点在平面上,可以得出.

道路运输车辆卫星定位系统标准符合性检测 ----新规则、新方法

道路运输车辆卫星定位系统标准符合性检测 ----新规则.新方法 全称叫道路运输车辆卫星定位系统标准符合性检测或道路运输车辆卫星定位系统标准符合性审查,口语(或简称)为过检.交通部过检.平台过检.平台测试等等,符合性审查分硬件和平台,硬件就是即是车载终端,平台即运营平台,平台分企业平台.政府平台,企业平台分经营性与非经营性平台,政府平台分市级平台与省级平台.在这里讨论的是平台符合性审查,而非硬件. 此博文只介绍2015年恢复检测之后,采取的新测试规则,新测试方法.关于符合性审查的更详细说明,请参看

快学Scala 第十三课 (类型层级,对象相等性)

Scala 类型层级: 对象相等性: 和Java一样要重写equals方法和hashcode方法 class Student(val id: Int, val name: String) { override def equals(other: Any) = { val that = other.asInstanceOf[Student] if (that == null) false else id == that.id && name == that.name } override d

Java常见问题之引用相等性和对象相等性

==和!=用来比较引用相等性. Object类具有hashCode()和equals()方法,hashCode()返回根据对象所在内存位置计算得到的一个值(即两个对象的hashcode值一定不同),equals()执行两个对象的==比较.所以如果一个类没有覆盖hashCode()和equals()方法,则它的hashCode()和equals()方法执行的是引用相等性的比较. 如果想执行对象相等性的比较,就要覆盖hashCode()和equals()方法. 例如HashSet类会采用如下方法比较

AABB和平面的相交性检测

[AABB和平面的相交性检测]

navigtor对象和插件检测

每一个浏览器都内置了属于自己的一套属性和方法 浏览器中navigator对象有plugins属性对象存着插件的数组 每一项包含: name 插件名称 description 插件的描述 filename 插件的文件名 length 插件所处理的MIME类型的数量 插件检测函数 function hasPlugin(name){ name = name.toLowerCase();//把传入的字符变为小写 for (var i=0;i<navigator.plugins.length ;i++ )

内核对象&amp;句柄&amp;泄漏&amp;检测

今天看到这个问题如何评价王垠的 <讨厌的 C# IDisposable 接口>? - 王垠(人物),答案被歪到windows 内核对象和句柄,答案中谈的太浅显而且有误.翻出陈年老文章(此文成于2012年,只在公司内部分享过),大部分内容来自Windows内核原理 1句柄和句柄泄露 在Windows编程过程中,很多时候我们都要和句柄打交道,比如窗体句柄,内核对象句柄,GDI句柄,Windows Multimedia库中的多种句柄等等,以及其他更多未曾使用过的句柄类型.句柄(Handle)是Win

BOM学习3--navigator对象跨浏览器检测插件

一,检测插件: 随着互联网的发展,HTML5的标准也成为开发网页的标准,其中比如H5的video标签,就可以直接嵌入到网页成为一个播放器,这就把传统的Flash播放器的功能给取代了.我们在开发不同的项目,可能会依据项目的不同需求,选择使用H5播放器或者Flash插件,这就需要我们在浏览器中识别安装的插件,下面就是一个跨浏览器的插件检测方法: 1,对于非IE浏览器,我们可以直接使用plugins这个数组来遍历插件,下面是数组每一项包含的属性: name: 插件的名字, description:插件