1. 程式人生 > >記錄一下JFinal 在controller 新增事務處理

記錄一下JFinal 在controller 新增事務處理

controller新增事務;

@Before(value = { ErrorInterceptor.class, Tx.class }) 
前面是攔截器處理自定義拋異常 攔截器把錯誤資訊顯示到頁面   這種事務的寫法 如果程式碼加了try 事務是不起作用的  必須手動拋異常
public class XXController extends BaseMsgController {}
剛開始 我寫成了  @Before(Tx.class)  不管怎麼弄都不好使, 這種寫法是新增到方法上的

自定義拋異常程式碼: 下面catch裡面 不手動拋異常 事務是不會回滾的   如果是在方法上面加 @Before...則不用手動拋 如果是在類上面整體加的需要手動拋異常
	                       try {
					order.update();
					reVo = new ReVo(order);
				} catch (Exception e) {
					logger.info(e.getMessage());
					Map<String, Object> map = new HashMap<String, Object>();
					map.put("msg", "網路異常請重新整理重試!");
					UnifyThrowEcxp.throwExcp(e, map);
				}

異常處理類:
public class UnifyThrowEcxp {

	/**
	 * 統一拋異常- maps裡面可自定義異常引數
	 */
	public static void throwExcp(Exception e, Map<String, Object> maps) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("msg", e.getMessage());
		map.put("text", e.getMessage());
		if (!maps.isEmpty()) {
			map.put("errMsg", JSONObject.toJSONString(maps));
		}
		throw new RuntimeException(JSONObject.toJSONString(map));
	}

}

攔截器錯誤處理: 這裡只是簡單的 處理了一下 直接把錯誤資訊render到了頁面

public class ErrorInterceptor implements Interceptor {

	public void intercept(Invocation ai) {
		try {
			ai.invoke();
		} catch (Exception e) {
			JSONObject jo = JSONObject.parseObject(e.getMessage());
			ai.getController().renderJson(jo.toJSONString());
		}
	}
}

執行結果:


手動拋錯呼叫的程式碼:  如果不新增自定義錯誤資訊 就直接傳一個 空的map就行

                                Map<String, Object> map = new HashMap<String, Object>();
				map.put("msg", "測試測試測試!");
				UnifyThrowEcxp.throwExcp(e, map);


菜鳥發帖 大神勿噴  純屬記錄一下過程