首页>代码>spring boot+jfinal的ActiveRecordPlugin重新整合林业厅会议系统>/bf/src/main/java/com/example/bf/config/JFinalTxAop.java
package com.example.bf.config; import com.jfinal.kit.LogKit; import com.jfinal.plugin.activerecord.ActiveRecordException; import com.jfinal.plugin.activerecord.Config; import com.jfinal.plugin.activerecord.DbKit; import com.jfinal.plugin.activerecord.NestedTransactionHelpException; import com.jfinal.plugin.activerecord.tx.TxConfig; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.SQLException; /** * @author wgw * @date 2018/4/13 */ @Aspect @Component public class JFinalTxAop { /** * 自定义JFinal 事物注解 * value中的意思解释 * * @annotation 表示注解只能支持方法上 * @within 表示注解在类下面所有的方法 , 暂时不使用这种方式 */ @Pointcut("@annotation(com.example.bf.config.JFinalTx)") private void method () { } @Around(value = "method()", argNames = "pjp") public Object doAround ( ProceedingJoinPoint pjp ) throws Throwable { Object retVal = null; Config config = getConfigWithTxConfig( pjp ); if (config == null) config = DbKit.getConfig(); Connection conn = config.getThreadLocalConnection(); // Nested transaction support if (conn != null) { try { if (conn.getTransactionIsolation() < getTransactionLevel( config )) conn.setTransactionIsolation( getTransactionLevel( config ) ); retVal = pjp.proceed(); return retVal; } 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 ); retVal = pjp.proceed(); conn.commit(); } catch (NestedTransactionHelpException e) { if (conn != null) try { conn.rollback(); } catch (Exception e1) { LogKit.error( e1.getMessage(), e1 ); } LogKit.logNothing( e ); } catch (Throwable t) { if (conn != null) try { conn.rollback(); } catch (Exception e1) { LogKit.error( e1.getMessage(), e1 ); } 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) { // can not throw exception here, otherwise the more important exception in previous catch block can not be thrown LogKit.error( t.getMessage(), t ); } finally { // prevent memory leak config.removeThreadLocalConnection(); } } return retVal; } /** * 获取配置的事务级别 * * @param config * @return */ protected int getTransactionLevel ( Config config ) { return config.getTransactionLevel(); } /** * @param pjp * @return Config */ public static Config getConfigWithTxConfig ( ProceedingJoinPoint pjp ) { MethodSignature ms = (MethodSignature) pjp.getSignature(); Method method = ms.getMethod(); TxConfig txConfig = method.getAnnotation( TxConfig.class ); if (txConfig == null) txConfig = pjp.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; } }
最近下载更多
wy4525 LV6
2022年8月12日
zhaoyangwfd LV17
2022年3月31日
最呆萌呀 LV7
2022年3月13日
wanglinddad LV55
2021年12月25日
893213895 LV18
2021年12月17日
敏敏 LV1
2021年12月9日
最代码-宋家辉 LV61
2021年10月6日
icesolitude LV8
2021年7月7日
哆啦A梦伴我同行 LV10
2021年6月17日
wmm966520 LV5
2021年6月3日