首页>代码>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梦伴我同行 LV11
2021年6月17日
wmm966520 LV5
2021年6月3日

最近浏览