如果 @transactional 应用于类级别,我想捕获它的参数。
例如如果 @transactional
在方法级别应用,例如:-
class A {
@transactional(readOnly= true)
public void someMethod(){
// some code...
}
}
然后我就可以使用以下代码拦截并捕获形式参数,即只读:-
@Aspect
@Component
@Order(0)
public class ReadOnlyRouteInterceptor {
private static final Logger logger = LoggerFactory.getLogger(ReadOnlyRouteInterceptor.class);
@Around("@annotation(transactional)")
public Object proceed(ProceedingJoinPoint proceedingJoinPoint, Transactional transactional) {
if (transactional.readOnly())
//do something
}
但是,如果 @transactional
在类级别应用为:-
@transactional(readOnly= true)
class A {
public void someMethod(){
// some code...
}
}
现在为了拦截在类级别应用的 @transactional
注释,我有以下代码:-
@Pointcut("@within(org.springframework.transaction.annotation.Transactional *)")
public void beanAnnotatedWithTransactional() {}
@Pointcut("execution(public * *(..))")
public void publicMethod() {}
@Pointcut("publicMethod() && beanAnnotatedWithTransactional()")
public void publicMethodInsideAClassMarkedWithATransactional() {}
我的实际问题是,如果在类级别应用 @transactional
,我无法检查 readOnly 标志的值。
最佳答案
对于类型级别注释:
@Around("@within(transactional)")
public Object myMethod(ProceedingJoinPoint pjp, Transactional transactional) throws Throwable {
boolean readOnly = transactional.readOnly();
...
return pjp.proceed();
}
对于方法级别注释:
@Around("execution(public * *(..)) && @annotation(org.springframework.transaction.annotation.Transactional)")
public Object myMethod(ProceedingJoinPoint pjp) throws Throwable {
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
Transactional annotation = method.getAnnotation(org.springframework.transaction.annotation.Transactional.class);
boolean value = annotation. readOnly();
...
return pjp.proceed();
}
方法级别的另一个(更干净的)选项:
@Around("@annotation(transactional)")
public Object myMethod(ProceedingJoinPoint pjp, Transactional transactional) throws Throwable {
}
或
对标记器有更多控制:
@Around("execution(@org.springframework.transaction.annotation.Transactional public * *(..)) && @annotation("transactional")
public Object myMethod(ProceedingJoinPoint pjp, Transactional transactional) throws Throwable {
}
关于java - 如果 @transactional 在类级别应用,如何拦截 @transactional 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59553908/