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

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

使用方法:

package patterns.singleton.demo;import junit.framework.Assert;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import patterns.singleton.demo.exception.BizException;
import patterns.singleton.demo.exception.IErrorCode;
import patterns.singleton.demo.exception.NotExistErrorCode;
import patterns.singleton.demo.exception.ResultSet;
import patterns.singleton.demo.model.Order;
import patterns.singleton.demo.model.Product;
import patterns.singleton.demo.CheckEntityExistManager.EntityChecker;
import static patterns.singleton.demo.CheckEntityExistManager.checkEntity;public class EntityExistCheckTester {private static final Log log = LogFactory.getLog(EntityExistCheckTester.class);public static void main(String[] args) throws BizException {ResultSet result = demo();Assert.assertEquals(NotExistErrorCode.ERROR_ORDER_NOT_EXIST.getCode(), result.getCode());Assert.assertEquals(NotExistErrorCode.ERROR_ORDER_NOT_EXIST.getMsg(), result.getMsg());ResultSet res2 = demo2();Assert.assertEquals(IErrorCode.SUCCESSFUL.getCode(), res2.getCode());Assert.assertEquals(IErrorCode.SUCCESSFUL.getMsg(), res2.getMsg());}public static ResultSet demo() {try {// Not Need type casting Order order = checkEntity(EntityChecker.ORDER_ID_CHECK, "123", "user-defined msg: order not exist when creating");System.out.println(order);return new ResultSet(IErrorCode.SUCCESSFUL);} catch (BizException bizEx) {log.error(bizEx.getMessage(), bizEx);return new ResultSet(bizEx.getErrorCode());} catch (Exception ex) {log.error(ex);return new ResultSet(IErrorCode.FAILED);}}public static ResultSet demo2() {try {Product p = checkEntity(EntityChecker.PRODUCT_NAME_CHECK, "God");System.out.println(p);return new ResultSet(IErrorCode.SUCCESSFUL);} catch (BizException bizEx) {log.error(bizEx.getMessage(), bizEx);return new ResultSet(bizEx.getErrorCode());} catch (Exception ex) {log.error(ex);return new ResultSet(IErrorCode.FAILED);}}}

实体存在性集中检测类: CheckEntityExistManager:
package patterns.singleton.demo;import java.util.HashMap;
import java.util.Map;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import patterns.singleton.demo.exception.BizException;
import patterns.singleton.demo.exception.IErrorCode;
import patterns.singleton.demo.exception.NotExistErrorCode;
import patterns.singleton.demo.model.Order;
import patterns.singleton.demo.model.Product;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<Order> orderIdChecker = checkEntityMgr.new CheckOrderExist();private static ICheckEntityExist<Product> productChecker = checkEntityMgr.new CheckProductExist();public enum EntityChecker {ORDER_ID_CHECK(orderIdChecker, NotExistErrorCode.ERROR_ORDER_NOT_EXIST),PRODUCT_NAME_CHECK(productChecker, NotExistErrorCode.ERROR_PRODUCT_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;}}// may using spring bean autowired in actual projectsprivate OrderService orderService = new OrderService() {public Order queryOrderByOrderId(int orderId) {return null;}};private ProductService productService = new ProductService() {public Product queryProductByName(String productName) {Product p = new Product();p.setProductId(1);p.setName("God");p.setDesc("Aman");return p;}};class CheckOrderExist implements ICheckEntityExist<Order> {public Order checkEntityExist(String orderId, String msg) throws BizException {IErrorCode errorCode = EntityChecker.getErrorCode(CheckOrderExist.class.getSimpleName());String message = (msg == null ? errorCode.getMsg() : msg);Order order = orderService.queryOrderByOrderId(Integer.parseInt(orderId));return CheckEntityExistManager.throwexOrReturn(order, message, errorCode);}}class CheckProductExist implements ICheckEntityExist<Product> {public Product checkEntityExist(String productName, String msg) throws BizException {IErrorCode errorCode = EntityChecker.getErrorCode(CheckProductExist.class.getSimpleName());String message = (msg == null ? errorCode.getMsg() : msg);Product p = productService.queryProductByName(productName);return CheckEntityExistManager.throwexOrReturn(p, 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);}}interface OrderService {Order queryOrderByOrderId(int orderId);
}interface ProductService {Product queryProductByName(String productName);
}

异常、错误代码相关的类:

package patterns.singleton.demo.exception;public class BizException extends RuntimeException {private int code;private String msg;private IErrorCode errorCode;public BizException(String msg) {super(msg);}public BizException(IErrorCode error) {this.errorCode = error;this.code = error.getCode();this.msg = error.getMsg();}public BizException(Throwable cause) {super(cause);}public IErrorCode getErrorCode() {return errorCode;}}

package patterns.singleton.demo.exception;public interface IErrorCode {int getCode();String getMsg();public IErrorCode SUCCESSFUL = new IErrorCode() {public int getCode() {return 200;}public String getMsg() {return "successful";}};public IErrorCode FAILED = new IErrorCode() {public int getCode() {return 0;}public String getMsg() {return "failed";}};}

package patterns.singleton.demo.exception;public enum NotExistErrorCode implements IErrorCode {ERROR_ORDER_NOT_EXIST(-180, "order not exist"),ERROR_PRODUCT_NOT_EXIST(-190, "product not exist");private int code;private String msg;NotExistErrorCode(int code, String msg) {this.code = code;this.msg = msg;}public int getCode() {return this.code;}public String getMsg() {return this.msg;}}

package patterns.singleton.demo.exception;public class ResultSet<T> {public static final ResultSet SUCCESS = new ResultSet();private int code;private String msg;private T data;public ResultSet() {this.code = 200;this.msg = "success";}public ResultSet(T data) {this();this.data = data;}public ResultSet(int code, String msg) {this.code = code;this.msg = msg;}public ResultSet(IErrorCode ex) {this(ex.getCode(), ex.getMsg());}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}}

数据对象:

package patterns.singleton.demo.model;public class Order {private Integer orderId;private String productName;private int    account;public Integer getOrderId() {return orderId;}public void setOrderId(Integer orderId) {this.orderId = orderId;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}public int getAccount() {return account;}public void setAccount(int account) {this.account = account;}}

package patterns.singleton.demo.model;public class Product {private Integer productId;private String name;private String desc;public Integer getProductId() {return productId;}public void setProductId(Integer productId) {this.productId = productId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}}

转载于:https://www.cnblogs.com/lovesqcc/p/4143665.html

对象存在性检测集中管理相关推荐

  1. array,vector对象 数组越界检测

    array,vector对象 数组越界检测 posted on 2017-11-15 16:20 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnbl ...

  2. C++学习笔记-----函数调用时的决议:名字查找,重载决议,可访问性检测

    第一个程序 class myClass { public:myClass() {}double func(double n) { return n; } private:int func(int n) ...

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

    前面的话 navigator对象现在已经成为识别客户端浏览器的事实标准,navigator对象是所有支持javascript的浏览器所共有的.本文将详细介绍navigator对象和用户代理检测 属性 ...

  4. 工信部数字电视标准符合性检测中心发布的

    昨天,工信部数字电视标准符合性检测中心发布的<2012年中国平板电视质量分析报告>显示,去年国内电视机产品质量合格率为87.8%,近三年来呈现出逐年提高的趋势. 根据工信部的报告,2010 ...

  5. 【软件构造】equals()、hashCode()及引用等价性、对象等价性、观察等价性、行为等价性

    文章目录 一.等价关系 二.引用等价性和对象等价性 1.引用等价性 ==: 2.对象等价性equals: 三.hashCode()方法 1.对于不可变类型 2.对于可变类型 四.观察等价性和行为等价性 ...

  6. OpenCV—python 显着性检测二

    这里只是展示一下OpenCV自带的显着性检测函数.效果都不是很好,各位可以测试一下. 需要OpenCV 3.4或更高版本 cv2.saliency.ObjectnessBING_create() cv ...

  7. 密集环境下物体吸取可供性检测及其自监督学习方法

    摘要: 在仓储物流中,散乱件分拣是影响整体效率的关键环节之一,机械臂抓取操作因灵活高效而广泛应用于此.为提高分拣成功率和标签获取效率,提出了一种两阶段物体吸取可供性检测网络及其自监督学习方法.区域预测 ...

  8. Scala——(常用类型与字面量,Scala类层次结构,值与变量自动类型推断,操作符,块表达式和赋值语句,输出和输出,字符串插值器,对象相等性)

    文章目录 常用类型与字面量 Scala类层次结构 值与变量&自动类型推断 操作符 块表达式和赋值语句 输出和输出 字符串插值器 对象相等性 常用类型与字面量 Scala和Java一样,有8种数 ...

  9. 物联网技术西电捷通TRAIS符合性检测系统的应用研究

    引言   随着信息技术与网络的快速融合发展,以射频识别(Radio Frequency Identification,简称RFID)应用为主要内容的物联网逐渐走进人们的生活,使得无处不在的网络应用成为 ...

最新文章

  1. LeetCode简单题之密钥格式化
  2. Scons构建C++项目
  3. 关于Java的Classpath详解
  4. VIT pytorch源码
  5. python中的os.mkdir和os.makedirs的使用区别,以及如何查看某个模块中的某些字母开头的属性方法
  6. matlab mobilenet v2,MobileNetV2-SSDLite代码分析-6 VOC Dataset
  7. [一个经典的多线程同步问题]解决方案一:关键段CS
  8. windows下面怎么github ssh 公钥,然后克隆项目
  9. Docker 环境:Nexus3.x 的私有仓库
  10. python生成簇_使用Python复现SIGKDD2017的PAMAE算法(并行kmedoids算法)
  11. 十个程序员必备的网站_程序员必备网站之一:VisuAlgo
  12. 高校邦HTML5,高校邦视频自动播放器
  13. 使用Visual Studio命令提示查看cad中的重整函数
  14. excel 转html 样式丢失,excel2010繁体转简体不见了
  15. 俄亥俄大学计算机科学专业,北俄亥俄大学专业都有哪些呢?了解一下!
  16. java FreeMarker模板路径问题
  17. php 生成pdf 中文,用PHP创建PDF中文文档
  18. 根据经纬度查询数据mysql
  19. Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
  20. 心田花开:七年级语文第一单元《济南的冬天》知识点汇总

热门文章

  1. java发送苹果消息慢_Spring-boot JMS 发送消息慢的解决方法
  2. 以太坊RLP编码规则
  3. 村上春树 开始写作_如何克服对写作的恐惧并找到开始的动力
  4. 代码改变世界_改变世界,一次只写一行代码
  5. Java序列化的机制和原理
  6. oracle 11g wm_concat 、 listagg 函数的使用(合并数据)
  7. [Java实现] 图片择优(选择最清楚的图片)
  8. Javascript及Jquery获取元素节点以及添加和删除操作
  9. C语言双链表遍历,插入,删除
  10. 配置导出MOSS2010列表数据到Excel并根据列表记录自动刷新数据