【问题标题】:@ManagedBean and @Transactional - bug in Spring? Workarounds?@ManagedBean 和 @Transactional - Spring 中的错误?解决方法?
【发布时间】:2012-01-15 10:44:31
【问题描述】:

我的 Web 应用中有以下 JSF 支持 bean

@ManagedBean
class MyBackingBean implements Serializable {

    private MyHibernateRepository repository;
    ...

    @Transactional 
    public void save() {
        ....
        repository.save(myObject);
    }

}

当它到达 repository.save 方法调用时 - 我收到以下错误

no transaction is in progress

我有两个问题

  1. 这是因为like this 的错误吗?
  2. 我相信有两种解决方法 - 还有其他解决方法吗?

2.1 第一个解决方法 - 使用

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  protected void doInTransactionWithoutResult(TransactionStatus status) {
    repository.save(myObject);
  }
});

2.2 第二种解决方法

创建一个辅助类并对其进行注释。

2.3(可能的第三种解决方法是在内部类的方法上注释@Transactional 这与2.2 非常相似)。

【问题讨论】:

    标签: spring jsf-2 managed-bean transactional spring-transactions


    【解决方案1】:

    当使用 Spring 注释时(我知道 @Transactional 是 Sun 标准 - 但您需要一个实现) - Spring 使用 AOP 对类进行注释以添加事务处理代码。这仅适用于 Spring bean。如果您的类是 JSF 的支持 bean - Mojarra 框架不会将其自己的事务处理代码插入到此注释中。

    简短回答 - @Transactional 适用于 Spring 加载的 bean。否则,您需要找到一个支持它的框架或假设它不起作用。

    【讨论】:

    • 这是要讨论的事情。除了将@Transactional 添加到@ManagedBean 本身的技术问题之外,我们还可以讨论根据MVC 模式这样做的后果。作为 JSF 一个视图层框架,在那里定义事务操作是否合乎道德,还是应该将它们放在服务层中?假设您创建 JSF 操作方法 @Transactional 而不是服务上的操作,则需要为其他可能的访问层(例如 Web 服务)复制 @Transactional 注释。
    猜你喜欢
    • 2019-02-26
    • 2017-06-18
    • 2015-05-15
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2012-01-04
    相关资源
    最近更新 更多