当前位置: 首页 > 编程日记 > 正文

对象存在性检测集中管理

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

       美中不足的一点是, 打 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

相关文章:

20155204 2016-2017-2 《Java程序设计》第3周学习总结

20155204 2016-2017-2 《Java程序设计》第3周学习总结 教材学习内容总结 一个原始码中可以有多个类定义&#xff0c;但只能有一个公开类。留心Scanner对于每一种类型的nextxxxx()方法以Java开头的都是API提供的类使用Integer.valueOf()也是为基本类型建立打包器的方式之一Integ…

js表单提交,支持图片上传,包含后端php代码

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 <html><head><meta http-equiv"Content-Type" content"charsetutf-8" /><title>图片上传成功</title></head><body><form name"…

如何破解汽车-快速的速成课程

by Kenny Kuchera肯尼库切拉(Kenny Kuchera) 如何破解汽车-快速的速成课程 (How to hack a car — a quick crash-course) The goal of this article is to get you started hacking cars — fast, cheap, and easy. In order to do this, we’ll spoof the RPM gauge as an e…

367. Valid Perfect Square

题目&#xff1a; Given a positive integer num, write a function which returns True if num is a perfect square else False. Note: Do not use any built-in library function such as sqrt. Example 1: Input: 16 Returns: TrueExample 2: Input: 14 Returns: False 链接…

使用reuseport和recvmmsg优化UDP服务器

http://skoo.me/system/2014/03/18/udp-server-performance/ http://www.helplib.net/s/linux.die/65_3223/man-2-recvmmsg.shtml recvmmsg(2) - Linux man page转载于:https://www.cnblogs.com/jingzhishen/p/4145732.html

js把for循环出来的数据存入数组

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 var obj [];for(var i 0;i<obj.length;i){arr.push(obj[i]);}; console.obj(arr); 1&#xff1a;obj是一个数组对象 2&#xff1a;push()方法是数组的栈底添加 意思是往数组的底部添加 3&#xff1a…

flexbox布局_这是您可以使用FlexBox制作的5种布局

flexbox布局The CSS Flexible Box Layout — Flexbox — provides a simple solution to the design and layout problems designers and developers have faced with CSS. Let me show you how to use it to generate some common layouts and challenges that you will face …

数据结构之线性表

数据结构之线性表 目录 概述顺表特点 顺表的操作 准备 创建顺表 查询顺表长度 遍历顺表 按序查找 按值查找 插入 删除 链表实际使用概述 线性表是一种线性的存储结构&#xff0c;表头有唯一后继元素&#xff0c;表尾有唯一前驱元素&#xff0c;表中的元素既有前驱又有后继 顺表…

【BZOJ-3456】城市规划 CDQ分治 + NTT

题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id3456 Solution 这个问题可以考虑dp&#xff0c;利用补集思想 N个点的简单图总数量为$2^{\binom{N}{2}}$&#xff0c;要求的是简单联通图&#xff0c;所以可以用总量减不连通的。 不连通的可以通过枚举与某个固定点的…

微信小程序获取openid和session_key并且把openid存入数据库

微信小程序开发交流qq群 581478349 微信小程序获取openid和session_key并且把openid存入数据库。已经调用openid的demo 前后端代码都有&#xff0c;后端php实现 在其它地方同步调用openid。&#xff08;确保用户完成登录再进行后续的操作&#xff09;&#xff1b; onLoad…

如何通过五个简单步骤成为更好的Stack Overflow用户

by Artem Stepanenko由Artem Stepanenko 如何通过五个简单步骤成为更好的Stack Overflow用户 (How to become a better Stack Overflow user in five simple steps) Software developers cannot imagine their lives without Stack Overflow.没有堆栈溢出&#xff0c;软件开发…

wm_concat

select org_name,department,to_char(wm_concat(ebs_org_num)) from GHB.org_add_tmp group by org_name,department ; 转载于:https://www.cnblogs.com/pier22/p/6546726.html

5 MySQL索引

目录&#xff1a; 1. 索引概述 1.1 为什么引入索引 1.2 什么是索引 1.3 索引的好处 1.4 索引的不足 1.5 索引分类 2. 索引设计原则 3. 索引建立和删除 3.1 索引创建 3.2 索引删除 4. 索引实验 1. 索引概述 1.1 为什么引入索引[1] 问题&#xff1a;假设数据库中一个表有10^6条记…

js多维数组渲染HTML js for循环渲染页面

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 直接上代码&#xff0c;有不懂的可以留言。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><script src"https://cdn.bootcss.com/jquery/2.1.1/jquery…

使用TensorFlow跟踪千年猎鹰

by Nick Bourdakos由Nick Bourdakos 使用TensorFlow跟踪千年猎鹰 (Tracking the Millennium Falcon with TensorFlow) At the time of writing this post, most of the big tech companies (such as IBM, Google, Microsoft, and Amazon) have easy-to-use visual recognition…

POJ2387 Til the Cows Come Home -DIJKSTRA 练习

题目大意是&#xff1a;有N个牛棚和T条边相连&#xff0c;每条边有个权值&#xff0c;问1号到N号牛棚之间的最短距离 本题是又是DIJKSTRA最短路水题&#xff0c;注意任何两个牛棚之间可能有多条路相连&#xff0c;输入时先输入边&#xff0c;再输入点&#xff0c;程序如下&…

<a>标签带参数跳转并在下一个页面接收

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; <a href"home.html?id1">跳转</a> //home.html <script type"text/javascript"> var aGetRequest();console.log("id:"a[id]) //…

Linux上PHP加入环境变量

export PATH$PATH:/usr/local/php/bin转载于:https://www.cnblogs.com/ttiandeng/p/6554902.html

计算机本科学位有用吗_我应该回到学校获得计算机科学学位吗?

计算机本科学位有用吗by Preethi Kasireddy通过Preethi Kasireddy 我应该回到学校获得计算机科学学位吗&#xff1f; (Should I go back to school to get a Computer Science degree?) This week’s question for my “Ask Preethi’ series is one that’s near and dear t…

[bzoj1054][HAOI2008]移动玩具

题意&#xff1a;在一个4*4的方框内摆放了若干个相同的玩具&#xff0c;某人想将这些玩具重新摆放成为他心中理想的状态&#xff0c;规定移动 时只能将玩具向上下左右四个方向移动&#xff0c;并且移动的位置不能有玩具&#xff0c;请你用最少的移动次数将初始的玩具状态移动到…

微信小程序实现滑动tab切换和点击tab切换并显示相应的数据(附源代码)

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; 先上效果图&#xff1a; 这里主要用到了swiper组件和三目运算&#xff0c;直接上代码&#xff0c; 样式只有三个class&#xff0c;简单粗暴&#xff0c;懒的小伙伴们可以直接拿来用&a…

使用java.util.Timer来周期性的执行制定的任务

使用java.util.Timer来周期性的执行制定的任务 1 public class HandlerTest extends Activity {2 int[] images new int[] {3 R.drawable.baiyang, R.drawable.jinniu, R.drawable.shuangyu4 };5 6 int currentImageID 0;7 8 Override9 prot…

数据库更行通知_哪个更好? 数据驱动还是数据通知?

数据库更行通知by Casper Sermsuksan由Casper Sermsuksan 哪个更好&#xff1f; 数据驱动还是数据通知&#xff1f; (Which is better? Data-Driven or Data-Informed?) I recently spoke at the Tech in Asia Product Development Conference in Jakarta about being data-…

从某一日期开始过day天的日期

一个SX问我的&#xff0c;我就写了写......从2010.1.1开始&#xff0c;给了一组测试数据3的话输出2010.1.4星期1&#xff0c;所以说2010.1.1是星期五&#xff0c;总星期就是 (day5)%70?7:(day5)%7下面是代码...... #include <iostream> #include <stdlib.h> using…

dhtmlxgrid表格笔记

因为公司以前架构的需求&#xff0c;所以对于dhtmlxgrid进行了简单的学习&#xff0c;参照dhtmlxgrid给出的例子进行摸索 1、必须引入的js包 <link rel"STYLESHEET" type"text/css" href"css/dhtmlxgrid.css"> <link rel"stylesh…

配置 腾讯云 SSL 证书 SSL证书实现https,环境:phpStudy下Apache环境

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; SSL证书实现https&#xff0c;环境&#xff1a;phpStudy下Apache环境 前提条件&#xff1a; 1.申请并下载好腾讯云申请的免费 ssl证书 腾讯云免费证书申请地址&#xff1a; http…

把canvas放在盒子内_如何将您的专业知识放在盒子中并出售

把canvas放在盒子内At RISE Conf in Hong Kong, Gary Vaynerchuk was asked:在香港的RISE Con​​f会议上&#xff0c; 加里韦纳楚克被问到&#xff1a; How do I make a living off my passion?我如何以激情为生&#xff1f; The answer from the marketing mogul was strai…

bzoj 4771: 七彩树 树链的并+可持久化线段树

题目大意: 给定一颗树,询问树中某个点x的子树中与其距离不超过d的所有点中本质不同的颜色数 强制在线 题解: 一下午终于把这道题叉掉了。 写了三个算法,前两个都是错的,后一个是%的网上大爷们的题解. 首先我们发现这道题有一个特点:没有修改操作 !! 这就使我们能够对颜色进行预…

Chapter 0: 引论

引论我之前就看过了&#xff0c;在我刚买到这本书的时候。 而我买这本书的日子&#xff0c;已经是两年前了。我就是这样子的&#xff0c;我买了好多好多关于技术的书&#xff0c;这些书都是很贵很贵的&#xff0c;可是买完回来之后就看了第一章&#xff0c;然后就一直丢在一边&…

开发常用CSS

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; keyframes -> 使 div 元素匀速向下移动 div{animation:myanimation 5s infinite;} keyframes myanimation {from {top:0px;}to {top:200px;}} 注:animation ->Css3动画属性 …