客户端和服务端对异常的不同处理态度【JFinal】

news/2024/7/5 18:57:18

服务端后台管理这种如果代码中抛出异常,其Tx事务能起作用,但是在客户端与服务端交互的时候很多都是通过JSON或者XML格式,为了用户体验,成功的话就正常返回,不成功也应该给出失败的信息,而不是直接报505这种错误,那么我们就需要在服务端自己处理掉异常,这样Tx就认为你的代码自己能处理异常,它就不起作用了。我回去查看了Tx的源码,它的原理就是在操作之前设置非自动提交,然后捕获异常,有异常就回滚,没有异常就提交。我们在写的时候也可以参照它的实现,相当于将我们处理的异常和数据库的处理异常合并。【基于JFinal】!!在这个Tx的源码中,当他抓到RuntimeException,它就继续把这个异常往外抛,否者就抛出ActiveRecordException(t),所以我们如果在我们的源码中应用了Tx,我们应该应用下面经过改造的Tx--》TxDoneEx,异常合并处理,而不要往外抛,是controller方法中还是可以自己处理异常,然后还需要往外抛,以TxDoneEx 能回滚事务。

将下面的所有处理异常的地方都改为我们自己处理,而不是往外抛。

public class TxDoneEx implements Interceptor {
	
	public static Config getConfigWithTxConfig(Invocation inv) {
		TxConfig txConfig = inv.getMethod().getAnnotation(TxConfig.class);
		if (txConfig == null)
			txConfig = inv.getTarget().getClass().getAnnotation(TxConfig.class);
		
		if (txConfig != null) {
			Config config = DbKit.getConfig(txConfig.value());
			if (config == null)
				throw new RuntimeException("Config not found with TxConfig: " + txConfig.value());
			return config;
		}
		return null;
	}
	
	protected int getTransactionLevel(Config config) {
		return config.getTransactionLevel();
	}
	
	public void intercept(Invocation inv) {
		Config config = getConfigWithTxConfig(inv);
		if (config == null)
			config = DbKit.getConfig();
		
		Connection conn = config.getThreadLocalConnection();
		if (conn != null) {	// Nested transaction support
			try {
				if (conn.getTransactionIsolation() < getTransactionLevel(config))
					conn.setTransactionIsolation(getTransactionLevel(config));
				inv.invoke();
				return ;
			} catch (SQLException e) {
				throw new ActiveRecordException(e);
			}
		}
		
		Boolean autoCommit = null;
		try {
			conn = config.getConnection();
			autoCommit = conn.getAutoCommit();
			config.setThreadLocalConnection(conn);
			conn.setTransactionIsolation(getTransactionLevel(config));	// conn.setTransactionIsolation(transactionLevel);
			conn.setAutoCommit(false);
			inv.invoke();
			conn.commit();
		} catch (NestedTransactionHelpException e) {
			if (conn != null) try {conn.rollback();} catch (Exception e1) {e1.printStackTrace();}
		} catch (Throwable t) {
			if (conn != null) try {conn.rollback();} catch (Exception e1) {e1.printStackTrace();}
			throw t instanceof RuntimeException ? (RuntimeException)t : new ActiveRecordException(t);
		}
		finally {
			try {
				if (conn != null) {
					if (autoCommit != null)
						conn.setAutoCommit(autoCommit);
					conn.close();
				}
			} catch (Throwable t) {
				t.printStackTrace();	// can not throw exception here, otherwise the more important exception in previous catch block can not be thrown
			}
			finally {
				config.removeThreadLocalConnection();	// prevent memory leak
			}
		}
	}
}

后来询问JFinal的作者詹波,得到了更好的解决方案。

无论如何返回给客户端一个json串http://www.oschina.net/question/2686150_2184260,它其中的一种方法Db.tx就是我这种解决方案



http://www.niftyadmin.cn/n/3569829.html

相关文章

HTML5游戏开发实践之使用监控器

开发游戏的一个最大挑战是加入越来越多的游戏特性的同时能保持高帧率。好消息是, 浏览器比过去几年快了很多,HTML5开发游戏运行在恒定的60fps已经成为现实。这实属不易。 对于IE9,意味着要编写一个全新的JavaScript引擎, 使用多CPU内核和基于Direct2D的完全的硬件加速渲染管道。…

JSON的解析[Java-JSON、FastJSON、GSON]

Java-Json 一、 JSON &#xff08;JavaScript Object Notation&#xff09;一种简单的数据格式&#xff0c;比xml更轻巧。 Json建构于两种结构&#xff1a; 1、“名称/值”对的集合&#xff08;A collection of name/value pairs&#xff09;。不同的语言中&#xff0c…

CaSS中lisp命令不可用_干货在线 | 关于cass那些你不知道的秘密

南方数码地形地籍成图软件(简称CASS)是基于AutoCAD平台技术的GIS前端数据处理系统。CASS应用领域主要集中在下图的几个分支中&#xff0c;其中“行业应用”指CASS的一些行业应用版本&#xff0c;比如农村地籍版、勘测定界版、管线版等~小技巧画线&#xff1a;南方里面提供了强大…

内容查找

2019独角兽企业重金招聘Python工程师标准>>> Word查找栏代码通配符一览表 https://www.cnblogs.com/kevin-yuan/archive/2012/11/18/2775714.html 序号 清除使用通配符复选框 勾选使用通配符复选框 特殊字符 代码 特殊字符 代码or通配符 1 任意单个字符 ^?…

HTML5混合开发工程师行业前景分析

HTML5混合开发工程师&#xff0c;也叫Web前端开发工程师。HTML5前端是随着Web发展&#xff0c;细分出来的行业。H5混合开发工程师 &#xff0c;主要职责是利用HTML/CSS/JavaScript/DOM等各种Web技术 进行产品的界面开发。制作标准优化的代码&#xff0c;并增加交互动态功能&…

小岛经济学_解读《小岛经济学》(1)

下面我们就先来看第一个重要观点&#xff0c;促进经济增长的根本原因是生产而不是消费。所谓经济&#xff0c;说白了&#xff0c;就是使有限的资源产生最大的效益&#xff0c;以尽可能满足人类的需求。现实生活中&#xff0c;资源稀缺是常态&#xff0c;人类的需求永远也满足不…

掌握Thinkphp3.2.0----自动完成

自动完成&#xff0c;是在create数据的时候自动执行的一个或多个动作 自动完成也分为动态和静态两种 格式&#xff1a; //完成规则array(  array(完成字段1,完成规则,[完成条件,附加规则]),  array(完成字段2,完成规则,[完成条件,附加规则]),......); 完成字段&#xff1a;…

如何获取瘦人肠道菌群_这位90岁高龄的肌肉男,肠道中什么菌比较多?

本文由知几未来研究院&#xff08;微信公众号&#xff1a;zhijiDNA&#xff09;原创这可能是一个让“久坐族”心中一紧的研究。美国Tufts大学老龄营养研究中心近日发现&#xff0c;跟久坐、虚弱的老人相比&#xff0c;身体机能更强的老人拥有一批丰度更高的微生物群&#xff0c…