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

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

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

使用方法:

importstaticutil.CheckEntityExistManager.checkEntity;importutil.CheckEntityExistManager.EntityChecker;publicclassEntityExistCheckTester{privatestaticfinalLoglog=LogFactory.getLog(EntityExistCheckTester.class);publicstaticvoidmain(String[]args)throwsBizException{demo();demo2();}publicstaticResultSetdemo(){try{//NotNeedtypecastingDeviceDOdevice=checkEntity(EntityChecker.DISK_ID_CHECK,"d-xxx");System.out.println(device);VmDOvm=checkEntity(EntityChecker.VM_NAME_CHECK,"vm-name","user-definedmsg:vmnotexistwhencreating");System.out.println(vm);returnnewResultSet(IErrorCode.SUCCESSFUL);}catch(BizExceptionbizEx){log.error("error",bizEx);returnnewResultSet(bizEx.getErrorCode());}catch(Exceptionex){log.error(ex);returnnewResultSet(IErrorCode.FAILED);}}publicstaticResultSetdemo2(){try{ZoneDOzone=checkEntity(EntityChecker.ZONE_ID_CHECK,"z-yy");System.out.println(zone);returnnewResultSet(IErrorCode.SUCCESSFUL);}catch(BizExceptionbizEx){log.error("error",bizEx);returnnewResultSet(bizEx.getErrorCode());}catch(Exceptionex){log.error(ex);returnnewResultSet(IErrorCode.FAILED);}}}

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

publicclassCheckEntityExistManager{privatestaticfinalLoglog=LogFactory.getLog(CheckEntityExistManager.class);privatestaticCheckEntityExistManagercheckEntityMgr=getInstance();privateCheckEntityExistManager(){}privatestaticCheckEntityExistManagergetInstance(){if(checkEntityMgr==null){checkEntityMgr=newCheckEntityExistManager();}returncheckEntityMgr;}interfaceICheckEntityExist<T>{TcheckEntityExist(StringentityValue,Stringmsg)throwsBizException;}privatestaticICheckEntityExist<DeviceDO>diskIdChecker=checkEntityMgr.newCheckDiskIdExist();privatestaticICheckEntityExist<VmDO>vmNameChecker=checkEntityMgr.newCheckVmExist();privatestaticICheckEntityExist<ZoneDO>zoneChecker=checkEntityMgr.newCheckZoneExist();publicenumEntityChecker{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,IErrorCodeerrorCode){this.entityChecker=entityChecker;this.errorCode=errorCode;}privatestaticMap<String,IErrorCode>errorMap=newHashMap<String,IErrorCode>();static{for(EntityCheckerentityChecker:EntityChecker.values()){ICheckEntityExist<?>checker=entityChecker.getEntityChecker();errorMap.put(checker.getClass().getSimpleName(),entityChecker.getErrorCode());}}privatestaticIErrorCodegetErrorCode(StringcheckClassSimpleName){returnerrorMap.get(checkClassSimpleName);}privateICheckEntityExist<?>entityChecker;privateIErrorCodeerrorCode;publicICheckEntityExist<?>getEntityChecker(){returnentityChecker;}publicvoidsetEntityChecker(ICheckEntityExist<?>entityChecker){this.entityChecker=entityChecker;}publicIErrorCodegetErrorCode(){returnerrorCode;}publicvoidsetErrorCode(IErrorCodeerrorCode){this.errorCode=errorCode;}}@AutowiredprivateDeviceServicedeviceService;@AutowiredprivateVmServicevmService;@AutowiredprivateZoneServicezoneService;classCheckDiskIdExistimplementsICheckEntityExist<DeviceDO>{@OverridepublicDeviceDOcheckEntityExist(StringdiskId,Stringmsg)throwsBizException{IErrorCodeerrorCode=EntityChecker.getErrorCode(CheckDiskIdExist.class.getSimpleName());Stringmessage=(msg==null?errorCode.getMessage():msg);//DeviceDOdev=deviceService.getDevice(diskId);DeviceDOdev=newDeviceDO();returnCheckEntityExistManager.throwexOrReturn(dev,message,errorCode);}}classCheckVmExistimplementsICheckEntityExist<VmDO>{@OverridepublicVmDOcheckEntityExist(StringvmName,Stringmsg)throwsBizException{IErrorCodeerrorCode=EntityChecker.getErrorCode(CheckVmExist.class.getSimpleName());Stringmessage=(msg==null?errorCode.getMessage():msg);//VmDOvm=vmService.queryVmByName(vmName);VmDOvm=null;returnCheckEntityExistManager.throwexOrReturn(vm,message,errorCode);}}classCheckZoneExistimplementsICheckEntityExist<ZoneDO>{@OverridepublicZoneDOcheckEntityExist(StringzoneId,Stringmsg)throwsBizException{IErrorCodeerrorCode=EntityChecker.getErrorCode(CheckZoneExist.class.getSimpleName());Stringmessage=(msg==null?errorCode.getMessage():msg);//ZoneDOzone=zoneService.queryZoneById(zoneId);ZoneDOzone=null;returnCheckEntityExistManager.throwexOrReturn(zone,message,errorCode);}}publicstatic<T>TthrowexOrReturn(Tentity,Stringmessage,IErrorCodeerrorCode)throwsBizException{if(entity==null){log.error(message);thrownewBizException(errorCode);}returnentity;}publicstatic<T>TcheckEntity(EntityCheckerentityChecker,StringentityValue,StringcustomMsg)throwsBizException{ICheckEntityExist<T>checker=(ICheckEntityExist<T>)entityChecker.getEntityChecker();returnchecker.checkEntityExist(entityValue,customMsg);}publicstatic<T>TcheckEntity(EntityCheckerentityChecker,StringentityValue)throwsBizException{ICheckEntityExist<T>checker=(ICheckEntityExist<T>)entityChecker.getEntityChecker();returnchecker.checkEntityExist(entityValue,null);}}


其他精彩文章文章

Android KSOAP2调用.net webservicejQuery教程(8)-DOM树操作之使用反向插入方法android学习笔记(34)使用AlertDialog创建简单对话框android学习笔记(33)画廊视图(Gallery)的功能和用法android navidgation drawer 在导航抽屉中如何改变List选中项的...


更多关于android开发文章