java - 如果 @transactional 在类级别应用,如何拦截 @transactional 参数

标签 java spring spring-data-jpa

如果 @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/

相关文章:

security - Grails项目登录插件

Spring Data JPA 使用注入(inject)返回 "NoSuchMethodError"

javascript - 如何在 Android 上设置 React Native 导航?

java - 从 Java 代码中的 Import 语句查找 Maven 依赖项或 Repo

java - 无法在浏览器上将 Spring Boot XSRF-TOKEN 标志设置为安全

java - Dagger 2 : no injector factory bound for fragment

java - 无法将 Spring-Integration 与 RestTemplate 连接起来

spring - 升级到 Spring Boot 1.4 后 AbstractRememberMeService 中的 NullPointerException

java - 悲观锁不起作用 Spring Boot Data JPA

postgresql - 使用 JPA 而不是 native 查询在 postgres 中获取序列的下一个值