求解!!AOP+自定义注解可以切入Controller方法中,但是不能切入Service层

余生请_指教 2018-06-12 05:11:54

做系统的日志管理, 需要对管理员的操作进行保存.
想法是使用自定义注解+AOP , 在Controller中的方法贴自定义注解是可以切入的,但是在ServiceImpl的方法中贴注解, 却不切入.
有大牛说下,怎么解决吗?

serviceImpl方法中使用了@Transactional 事务注解. 有人说是和事务aop冲突了,

下面是LogAspect类

@Component
@Aspect
public class ConsoleSystemLogAspect {

private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleSystemLogAspect.class);

@Autowired
private IConsoleSystemLogService consoleSystemLogService;

@Pointcut("@annotation(com.inesv.root.common.annotation.RecordLog)")
public void logAspect(){}


@Before("logAspect()")
public void saveSystemLog(JoinPoint point) {
ConsoleSystemLog log = new ConsoleSystemLog();
// 获取Request
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 设置ip
String ipAddress = request.getRemoteAddr();
log.setIpAddress(ipAddress);
// 设置当前登录用户的用户名和id
ConsoleUser currentUser = (ConsoleUser) SecurityUtils.getSubject().getPrincipal();
log.setOpId(currentUser.getId());
log.setOpName(currentUser.getUsername());
// 设置时间
log.setOpTime(new Date());
// 设置方法
String simpleName = point.getSignature().getDeclaringType().getSimpleName();
String methodName = point.getSignature().getName();
String function = simpleName + "." + methodName;
log.setFunction(function);
// 设置参数
Object[] args = point.getArgs();
log.setParams(JSON.toJSONString(args));
LOGGER.info("操作日志:{}",JSON.toJSONString(log));
// 保存日志
consoleSystemLogService.save(log);

}


}


这是UserServiceImpl

@Service
public class ConsoleUserServiceImpl implements IConsoleUserService {

@Autowired
private ConsoleUserMapper consoleUserMapper;
@Autowired
private ConsoleUserRoleMapper consoleUserRoleMapper;

@Override
@RecordLog
@Transactional(rollbackFor = {Exception.class, RuntimeException.class},propagation = Propagation.NESTED)
public void delete(Long id) {
AssertUtils.isIdNull(id, "用户id不能为空", Context.CODE_ARGS_ERROR);
// 逻辑删除用户
consoleUserMapper.updateDeleteStatus(id);
}


}
...全文
2537 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hancaho0606 2020-04-27
  • 打赏
  • 举报
回复
可能是因为spring和springmvc是两个容器造成的
犬豪 2019-08-21
  • 打赏
  • 举报
回复
可能service层已经被很多切面切了,切面顺序问题导致失效
雾里看花の 2018-06-13
  • 打赏
  • 举报
回复 1
我的项目是spring boot,不过大体的配置还是一样的,下面是我的主要配置 注解类

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogsDescribe {

	/**
	 * 接口名称
	 * @return
	 */
	String value() default "";
	
}
Aspect

@Aspect
@Component
public class LogsDescribeAspect {

	private static final Logger logger = LoggerFactory.getLogger(LogsDescribeAspect.class);
	
	@Resource(name="operationLogService")
	private OperationLogService operationLogService;
	
	@Pointcut("@annotation(com.huangbl.blog.config.LogsDescribe)")
	private void cut() {
		
	}
	
	@Before("cut()")
	public void before(JoinPoint joinPoint) {
		logger.info("LogsDescribe...before");
	}
	
	@After("cut()")
    public void after(JoinPoint joinPoint) {
		logger.info("LogsDescribe...after");
    }
	
}
service中使用注解的方法和你的一样,代码我就不发了 最后就是Aspect自动代理,在spring配置文件中加上(在spring boot中只需要在服务启动类上加上@EnableAspectJAutoProxy)

<aop:aspectj-autoproxy proxy-target-class="true" />
雾里看花の 2018-06-13
  • 打赏
  • 举报
回复 1
楼主,我的项目里也用到了自定义注解,不过是加在controller中的,刚刚试了下加在service方法中(同时还加了@Transactional),是可以的呀!日志成功被记录下来了,楼主是不是没在spring配置文件中加上

<aop:aspectj-autoproxy proxy-target-class="true" />

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧