求解!!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);
}


}
...全文
1558 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hancaho0606 2020-04-27
可能是因为spring和springmvc是两个容器造成的
回复
扯犊拉孤 2019-08-21
可能service层已经被很多切面切了,切面顺序问题导致失效
回复
雾里看花の 2018-06-13
我的项目是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" />
回复 1
雾里看花の 2018-06-13
楼主,我的项目里也用到了自定义注解,不过是加在controller中的,刚刚试了下加在service方法中(同时还加了@Transactional),是可以的呀!日志成功被记录下来了,楼主是不是没在spring配置文件中加上

<aop:aspectj-autoproxy proxy-target-class="true" />
回复 1
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2018-06-12 05:11
社区公告
暂无公告