为了账号安全,请及时绑定邮箱和手机立即绑定

springBoot Aop可以切controller切不到service

springBoot Aop可以切controller切不到service

慕容森 2019-05-14 15:19:15
问题描述最近在做一个springboot的项目中使用aop做全局日志管理但是出现了这样的问题controller包下的类都正常的切到了,但是service层怎么也没反应问题出现的环境背景及自己尝试过哪些方法@EnableAspectJAutoProxy没用srping.aop.proxy-target-class=true/相关代码//请把代码文本粘贴到下方(请勿用图片代替代码)@ControllerpublicclassOCheckassoInfoControllerextendsBaseController{@Autowired@Resource(name="error_log")Loggererror_log;@AutowiredOCheckassoInfoInfoServiceOCheckassoInfoInfoService;@PostMapping(value="/oCheckassoInfo/queryData")@ResponseBodypublicMapqueryData(){HashMapresult=newHashMap();try{result.put("status",EnuConfig.REQUEST_SUCCESS);result.put("data",OCheckassoInfoInfoService.queryDataAll(this.getHashDataEntity()));returnresult;}catch(Exceptione){error_log.info(e.getMessage());e.printStackTrace();result.put("status",EnuConfig.REQUEST_FAIL);result.put("data","系统错误");returnresult;}}}切面类@Aspect@ComponentpublicclassLogAop{publicLoggerservice_log=LogManager.getLogger("service");@Pointcut("execution(public*com.solantec.sensitive_fraud_yinlian.*.*.*.*())")privatevoidaspect(){}@Before(value="aspect()")publicvoidmethodBefore(JoinPointjoinPoint){ServletRequestAttributesrequestAttributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletRequestrequest;service_log.info("===============requestcontext===============");if(requestAttributes!=null){request=requestAttributes.getRequest();service_log.info("requestaddr:"+request.getRequestURL().toString());service_log.info("requestmethod:"+request.getMethod());}service_log.info("params:"+Arrays.toString(joinPoint.getArgs()));service_log.info("targetmethod:"+joinPoint.getSignature());service_log.info("===============requestcontext===============");}@AfterReturning(returning="o",pointcut="aspect()")publicvoidmethodAfterReturing(Objecto){service_log.info("****************************result****************************");service_log.info("result:"+o);service_log.info("****************************result****************************");}}你期待的结果是什么?实际看到的错误信息又是什么?正常情况下控制台应该会打印两个===============requestcontext===============一个时controller的一个是service的但是service的死活就是没有
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

觉得是Pointcut表达式的问题,你可以看下Spring的Pointcut表达式问题,如果你service是基于接口变成,那你的表达式应该是没有扫描到子子包的内容,controller那边如果也有子包的话,子包下面应该也不会aop到的。如下两个表达式的区别定义在service包里的任意方法的执行:execution(com.xyz.service..*(..))
定义在service包和所有子包里的任意类的任意方法的执行:execution(com.xyz.service...*(..))
                            
查看完整回答
反对 回复 2019-05-14
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

建议:一、把日志调为debug,看详细日志,注意观察方法嵌套调用时,内部方法是否开启代理;二、可以先把controller排除掉,让aspectj表达式直接匹配service层,可以观察是否命中service层;
注意,如果你使用了aop的starter并在方法入口使用@SpringBootApplication,aop会自动开启并配置的,不用使用enable注解
                            
查看完整回答
反对 回复 2019-05-14
  • 2 回答
  • 0 关注
  • 960 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信