小弟刚刚学spring aop 遇到下面郁闷的问题
@Service
@Transactional(readOnly = true)
public class ManagerService {
@Autowired
private ManagerDao managerDao;
@Transactional(readOnly = false)
public Integer saveManager(String name) {
Manager manager = new Manager();
manager.setName(name);
return managerDao.save(manager);
}
@Transactional(readOnly = false)
public Manager updateManager(Integer id, String name) {
Manager manager = managerDao.get(id);
manager.setName(name);
return managerDao.update(manager);
}
public Manager get(Integer id) {
return managerDao.get(id);
}
}
@Service
@Transactional(readOnly = true)
public class LogService {
@Autowired
private LogDao logDao;
@Transactional(readOnly = false)
public Integer save(String signature, String clazz, String exceptionClass) {
Log log = new Log();
log.setClazz(clazz);
log.setExceptionClass(exceptionClass);
log.setSignature(signature);
return logDao.save(log);
}
}
@Aspect
@Component
public class ManagerServiceAOP {
@Autowired
private LogService logService;
private String signature;
private String clazz;
private String exceptionClass;
@Pointcut("execution(* org.yefei.app.service.*.*(..)) && !execution(* org.yefei.app.service.LogService.*(..))")
public void execute() {
}
@After("execute()")
public void after(JoinPoint jp) {
signature = jp.getSignature().toShortString();
clazz = jp.getTarget().toString();
exceptionClass = "没有异常抛出";
logService.save(signature, clazz, exceptionClass);
}
@AfterThrowing(pointcut = "execute()", throwing = "ex")
public void afterThrowing(JoinPoint jp, Throwable ex) {
logService.save(jp.getSignature().toShortString(), jp.getTarget()
.toString(), ex.getClass().toString());
}
}
在我执行下面代码时
@Test
public void testUpdateManager() {
managerService.updateManager(1, "张三");
}
发现aop类中的logService在执行后在控制台中有打印插入语句,但是数据库中却没有插入,不知道为什么。其他的插入操作都是可以执行的
上面的代码会抛异常,NullException,应该是对应aop中afterThrowing