我现在用SpringAOP的做了一个日志管理的功能,
事务控制在Service层,
Dao层是这样写的: public boolean saveEntity(Object object) throws Exception{
if(object != null){
try {
super.getHibernateTemplate().save(object);
return true;
} catch (Exception e) {
if(log.isDebugEnabled()){
log.debug("保存实体");
log.debug(this.getClass().getName() + DateControl.Now(), e);
}
e.printStackTrace();
throw e;
}
}
return false;
}
Service层是这样写的:public boolean addUser(WUser wUser, String userType) throws Exception {
if(wUser != null){
wUser.setUserId(null); //将实体主键设置成null触发内部异常
// 保存用户实体
if(super.saveEntity(wUser)){
return true;
}
}
return false;
}然后日志管理也是切入到Service层的,在记录日志的时候,碰到一个问题,就是事务是交给Spring去处理的,比如我现在手动的模拟一个异常,这时候在我的日志处理类中的@AfterReturning获取到的结果确还是true;只要在Action层去调用Service中的addUser方法这时候才会抓取到异常,而把日志AOP切到Service层的话,Spring的AOP就会最后统一去提交事务,@AfterReturning就拿不到正确的结果,不知道我的表达是不是够清楚,如果不清楚的话大家可以补充~这个问题困扰很长时间了,希望大家可以帮下忙~
事务控制在Service层,
Dao层是这样写的: public boolean saveEntity(Object object) throws Exception{
if(object != null){
try {
super.getHibernateTemplate().save(object);
return true;
} catch (Exception e) {
if(log.isDebugEnabled()){
log.debug("保存实体");
log.debug(this.getClass().getName() + DateControl.Now(), e);
}
e.printStackTrace();
throw e;
}
}
return false;
}
Service层是这样写的:public boolean addUser(WUser wUser, String userType) throws Exception {
if(wUser != null){
wUser.setUserId(null); //将实体主键设置成null触发内部异常
// 保存用户实体
if(super.saveEntity(wUser)){
return true;
}
}
return false;
}然后日志管理也是切入到Service层的,在记录日志的时候,碰到一个问题,就是事务是交给Spring去处理的,比如我现在手动的模拟一个异常,这时候在我的日志处理类中的@AfterReturning获取到的结果确还是true;只要在Action层去调用Service中的addUser方法这时候才会抓取到异常,而把日志AOP切到Service层的话,Spring的AOP就会最后统一去提交事务,@AfterReturning就拿不到正确的结果,不知道我的表达是不是够清楚,如果不清楚的话大家可以补充~这个问题困扰很长时间了,希望大家可以帮下忙~
setp1配置spring+struts2+ibatis环境后,运行测试正常。
setp2导入log4j-1.2.11.jar,在src下配置log4j.properties.
setp3定义消息spring框架aop机制的切面组件,环绕通知类型。
public class LogAspect {
private static Logger logger=null;
public Object loggerOpt(ProceedingJoinPoint pjp) {
//获取要执行的方法名和目标对象类型
String methodName=pjp.getSignature().getName();
String className=pjp.getTarget().getClass().getSimpleName();
logger=Logger.getLogger(className);
Object resObj = null;
try {
resObj = pjp.proceed();
//成功操作后记录用户操作信息
logger.info("操作成功,执行了"+methodName+"方法");
} catch (Throwable e) {
//发生异常后记录错误信息
logger.error("出错"+e.getMessage()+"\n"+"执行"+methodName+"出错");
}
return resObj;
}
}setp4定义spring相关配置
<!-- 定义充当切面的bean组件 -->
<bean id="Log" class="aspect.LogAspect"/>
<aop:config>
<!-- 定义切入点 -->
<aop:pointcut id="daoPoint" expression="execution (* action.*.*(..))"/>
<aop:aspect id="logAspect" ref="Log">
<!-- 定义环绕-->
<!-- 使用前面已经定义过的切入点 -->
<aop:around pointcut-ref="daoPoint" method="loggerOpt"/>
</aop:aspect>
</aop:config>