Я хочу добавить несколько журналов в свой сервис, поэтому я использую Annotation и AOP. Сначала я пишу такой код:
@Aspect
@Component
public class LogAspect {
@Autowired
LogService logService;
@Transactional
Object log(ProceedingJoinPoint point) throws Throwable{
Object obj = null;
Signature signature = point.getSignature();
MethodSignature methodSignature = (MethodSignature)signature;
Method method = methodSignature.getMethod();
LogAnnotation myAnno = method.getAnnotation(LogAnnotation.class);
String pageId=null;
JSONObject object=(JSONObject)point.getArgs()[0];
pageId=object.getString("pageId");
obj = point.proceed(); //do business job and affect the database
int i=1/0; //test Transactional
logService.insertLog(pageId,(LogVo)obj);
return obj;
}
@Around("@annotation(com.mycompany.annotation.LogAnnotation)")
public Object triggerSome(ProceedingJoinPoint pjp) throws Throwable {
return log( pjp);
}
}
В моем примере я добавил @Transactional
идобавьте исключение / by zero
, но когда код деловой работы все еще влияет на базу данных. Кажется, это не имеет ничего общего со словом @Transactional
. Как изменить мой код?Я пытаюсь изменить весь свой код на службу, но транзакция по-прежнему отсутствует.
@Aspect
@Component
public class LogAspect {
@Autowired
LogService logService;
@Around("@annotation(com.mycompany.annotation.LogAnnotation)")
public Object triggerSome(ProceedingJoinPoint pjp) throws Throwable {
return logService.commonLog( pjp);
}
}
Общая служба журналов:
@Transactional(rollbackFor=Throwable.class)
@Override
public Object commonLog(ProceedingJoinPoint point) throws Throwable{
Object obj = null;
Signature signature = point.getSignature();
MethodSignature methodSignature = (MethodSignature)signature;
Method method = methodSignature.getMethod();
LogAnnotation myAnno = method.getAnnotation(LogAnnotation.class);
String pageId=null;
JSONObject object=(JSONObject)point.getArgs()[0];
pageId=object.getString("pageId");
obj = point.proceed();
int i=1/0;
LogService.insertLog(pageId,(LogVo)obj);
return obj;
}