springBoot Aop可以切controller切不到service

新手上路,请多包涵

问题描述

最近在做一个springboot的项目中使用aop做全局日志管理

但是出现了这样的问题 controller包下的类都正常的切到了,但是service层怎么也没反应

问题出现的环境背景及自己尝试过哪些方法

@EnableAspectJAutoProxy 没用

srping.aop.proxy-target-class = true/

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

@Controller
public class OCheckassoInfoController extends BaseController {

@Autowired
@Resource(name = "error_log")
Logger error_log;

@Autowired
OCheckassoInfoInfoService OCheckassoInfoInfoService;

@PostMapping(value = "/oCheckassoInfo/queryData")
@ResponseBody
public Map<String,Object> queryData(){
    HashMap result = new HashMap();
    try {
        result.put("status",EnuConfig.REQUEST_SUCCESS);
        result.put("data", OCheckassoInfoInfoService.queryDataAll(this.getHashDataEntity()));
       return result;
    }catch (Exception e){
        error_log.info(e.getMessage());
        e.printStackTrace();
        result.put("status", EnuConfig.REQUEST_FAIL);
        result.put("data","系统错误");
        return result;
    }

}

}

切面类
@Aspect
@Component
public class LogAop {

public Logger service_log = LogManager.getLogger("service");

@Pointcut("execution(public * com.solantec.sensitive_fraud_yinlian.*.*.*.*())")
private void aspect(){}


@Before(value = "aspect()")
public void methodBefore(JoinPoint joinPoint){
    ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request;


    service_log.info("===============request context===============");
    if(requestAttributes != null){
        request = requestAttributes.getRequest();
        service_log.info("request addr:"+request.getRequestURL().toString());
        service_log.info("request method:"+request.getMethod());
    }
    service_log.info("params:"+ Arrays.toString(joinPoint.getArgs()));
    service_log.info("target method:"+joinPoint.getSignature());
    service_log.info("===============request context===============");
}


@AfterReturning(returning = "o",pointcut = "aspect()")
public void methodAfterReturing(Object o ){
    service_log.info("****************************result****************************");
    service_log.info("result :" + o);
    service_log.info("****************************result****************************");
}

}

你期待的结果是什么?实际看到的错误信息又是什么?

正常情况下控制台应该会打印两个 ===============request context===============
一个时controller的一个是service的 但是service的死活就是没有

阅读 6.4k
4 个回答

觉得是Pointcut表达式的问题,你可以看下Spring的Pointcut表达式问题,如果你service是基于接口变成,那你的表达式应该是没有扫描到子子包的内容,controller那边如果也有子包的话,子包下面应该也不会aop到的。
如下两个表达式的区别
定义在service包里的任意方法的执行:
execution( com.xyz.service..*(..))

定义在service包和所有子包里的任意类的任意方法的执行:
execution( com.xyz.service...*(..))

建议:
一、把日志调为debug,看详细日志,注意观察方法嵌套调用时,内部方法是否开启代理;
二、可以先把controller排除掉,让aspectj表达式直接匹配service层,可以观察是否命中service层;

注意,如果你使用了aopstarter并在方法入口使用@SpringBootApplicationaop会自动开启并配置的,不用使用enable注解

我也遇到这个问题了,因为集成了shiro,要把shiro Realm中自动注入的service设成@lazy就没问题了,具体原因没有深入研究

把你想切的Service贴出来看看呀

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题