怎样利用Spring Aop基于注解进行日志管理???

CUBA里面利用Spring Aop基于注释进行日志管理时,怎样对web模块中的方法进行拦截??

目前可以利用Spring Aop 对Service进行拦截

我目前的设计思路是:

1.自定义注释

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogAnno {
    String operateAction();         // 记录日志的操作动作:查询、登录、下载、浏览、抽取、审核等信息
    String operatePage();           //记录日志的操作页面
//    String downData();              //记录日志的数据下载量
}

2、创建切面

package com.company.testaop.aop;
@Component(NAME)
@Aspect
public class LogAspect {

    public static final String NAME = "logAopAspect";

    @Around("@annotation(cn.com.dataocean.khsqsg.annotions.LogAnno)")
    public Object aroundLogAnno(ProceedingJoinPoint pjp) throws Throwable{
        // 获取方法签名
        MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
        // 获取方法
        Method method = methodSignature.getMethod();
        // 获取方法上面的注解
        LogAnno logAnno = method.getAnnotation(LogAnno.class);
        //获得用户在系统中的 操作动作  信息
        String operateAction = method.getAnnotation(logAnno.getClass()).operateAction();
        //获得用户在系统中的 操作页面  信息
        String operatePage = method.getAnnotation(logAnno.getClass()).operatePage();
        获得用户在系统中的 数据下载量  信息
        String downData = method.getAnnotation(logAnno.getClass()).downData();

        获取操作动作的值
        String operateAction = logAnno.operateAction();
        String operatePage = logAnno.operatePage();
         创建一个日志对象(准备记录日志)
        UserDetail userDetail = new UserDetail();
        userDetail.setActions(operateAction);
        userDetail.setPage(operatePage);

        获取session中的user对象进而获取操作人名字
        User user = (User) khsqsg_TestService.getRequest().getSession().getAttribute("userinfo");

        Object result = null;
        try {
            让代理方法执行
            String d = "判断进入了切面没有";
            result = pjp.proceed();
             2.相当于后置通知(方法成功执行之后走这里)
           userDetail.setEmpName("正常");// 设置操作结果
        } catch (SQLException e) {
            3.相当于异常通知部分
           userDetail.setEmpName("失败");// 设置操作结果
        } finally {
            4.相当于最终通知
           userDetail.getActionDate(new Date());
           userDetail.setOperatedate(new Date());// 设置操作日期
            TestService.addLog(userDetail);// 添加日志记录
        }
        return result;
    }
}

3、在Service中进行注释

package com.company.testaop.service;
@Service(TestService.NAME)
public class TestServiceBean implements TestService {
    @Inject
    private Logtable logtable;
    private final static Logger log = getLogger(TestServiceBean.class);
    @Override
    public void crateTable() {
        String age = "不说话";
    }
    @Override
    @LogAnno(operateType = "输出信息")
    public boolean addLog(Logtable log) throws SQLException {
        String insetSql = "222222222";
        return true;
    }
}

4、我如果想在web层里面进行注释该怎么实现呢?

package com.company.testaop.web.logtable;

import com.company.testaop.annotation.LogAnno;
import com.company.testaop.service.TestService;
import com.haulmont.cuba.gui.components.AbstractLookup;
import com.haulmont.cuba.gui.components.Component;

import javax.inject.Inject;

public class LogtableBrowse extends AbstractLookup {
    @Inject
    private TestService testService;

    @LogAnno(operateType = "注释信息")
    public void onCreate(Component source) {
        testService.crateTable();
    }
}

你好,Screen Controller 并不是一个标准的Spring Bean,所以不能使用Spring AOP进行方法拦截。

同时我也在英文论坛发贴咨询了,你可以关注一下:
https://www.cuba-platform.com/discuss/t/is-it-possible-to-intercept-mehtod-of-screent-controller-using-spring-aop/9649

1 个赞

十分感谢您的帮助