java - 从服务类中调用时,Spring @Transactional 不适用于带注释的方法

标签 java spring spring-mvc spring-transactions

在下面的代码中,当从 methodOuter 中调用 methodInner() 时,应该在事务范围内。但事实并非如此。 但是当直接从 MyController 类调用 methodInner() 时,它受事务约束。有什么解释吗?

这是 Controller 类。

@Controller
public class MyController {

    @Autowired
    @Qualifier("abcService")
    private MyService serviceObj;

    public void anymethod() {
        // below call cause exception from methodInner as no transaction exists  
        serviceObj.methodOuter(); 
    }

}

这是服务等级

@Service("abcService")
public class MyService {

    public void methodOuter() {
        methodInner();
    }

    @Transactional
    public void methodInner() {
    .....
    //does db operation.
    .....
    }
}

最佳答案

Spring 默认使用 Java 代理来包装 bean 并实现带注释的行为。在服务中进行调用时,您会绕过代理并直接运行方法,因此不会触发带注释的行为。

可能的解决方案:

  1. 将所有 @Transactional 代码移到单独的服务中,并始终从外部调用事务方法

  2. 即使在服务中也可以使用 AspectJ 和编织来触发带注释的行为

关于java - 从服务类中调用时,Spring @Transactional 不适用于带注释的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26058100/

相关文章:

java - 使用基于注解的 MOXY 的 JAXB 实现 + 动态映射

java - 使用 Jackson 转换器将嵌套的 json 绑定(bind)到 @RequestBody 对象

java - org.springframework.web.servlet.DispatcherServlet noHandlerFound警告: No mapping for GET/springMVCDemo/createAccount. html

java - AngularJS 和 Spring MVC 安全性

javascript - 注销后禁用 spring mvc 应用程序中的浏览器后退按钮

java - 如何根据类的值将类对象添加到hashMap?

java - 使用 Spring Boot 更改生成的 CXF 服务器的日志级别

java - 比较两次格式 HH :MM java-android

java - 尽管authorizeRequests().anyRequest().permitAll(),spring-security仍返回401

java - Spring MVC - Eclipse 警告 - 验证消息