我现在用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就拿不到正确的结果,不知道我的表达是不是够清楚,如果不清楚的话大家可以补充~这个问题困扰很长时间了,希望大家可以帮下忙~

解决方案 »

  1.   

    http://seraph115.iteye.com/blog/816027
      

  2.   

    我也是初学者,saveEntity方法发生异常后应该不会执行后续的return false了吧;我也不太了解,下面是我自己做的方法
    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>
      

  3.   

    @AfterReturning是不管你错误与否都会执行的这是他与@After的区别,不然你可以用@After试一下就不会是TRUE了
      

  4.   

    应该是相反的!!!after是最终通知不管如何都会执行!!!