【问题标题】:Spring ignores @Transactional annotationsSpring 忽略 @Transactional 注释
【发布时间】:2017-09-11 11:39:26
【问题描述】:

似乎 spring 忽略了服务类上的 @Transactional 注释。 我读了一些q&a on SOblogs,但似乎没有一个选项适合我。

  1. 我没有调用私有方法 - 我调用的是在接口上公开的公共方法。
  2. 我正在调用不同类的方法(即不是从同一个类调用)。
  3. 我的“服务”类使用@Component@Transactional 进行注释。
  4. 我的“服务类有一个接口,我正在使用该接口和@Inject 注释注入它。
  5. 我尝试添加proxy-target-class="true",如其​​中一个答案中所述 - 没有用。
  6. 我使用的是 JAX-RS(不是 spring-mvc)。

当我收到此异常时,错误发生在 DAO 层上,并带有 @Transactional(propagation = Propagation.MANDATORY) 注释:

org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'

下面是一些代表所涉及的类和接口的通用代码:

public interface IService<T extends BaseEntity> {
    void save(T entity);
}

public abstract class AbstractService<T extends BaseEntity> implements IService<T> {

    @Inject
    private IDao dao;

    @Override
    public void save(T entity) {
        dao.save(entity);
    }
}

public interface IPersonService extends IService<PersonEntity> {
        void saveAll(List<PersonEntity> persons);
}

@Component
@Transactional
public class PersonService extends AbstractService<PersonEntity> implements IPersonService {

    @Override
    public void saveAll(List<PersonEntity> persons) {
        for (PersonEntity person : persons) {
            super.save(person);
        }
    }
}

@Component
public class PersonApi {

    @Inject
    private IPersonService personService;

    public void saveAll(...) {
        ...
        personService.saveAll(persons);
    }
}

有什么想法或建议吗?

【问题讨论】:

  • 如果你在同一个类上调用一个方法,这些都不重要。 AOP 仅适用于外部方法调用,而不适用于内部方法调用。但是,由于您尚未添加代码,因此无法查看错误在哪里。
  • 是什么让您认为它不起作用?你能分享一些代码吗?
  • 我没有从同一个类中调用该方法。正如我所说,我正在使用它的接口注入服务,并使用接口调用它。我正在努力提供一些代码示例...

标签: spring transactions spring-transactions


【解决方案1】:

所以事实证明我还必须用@Transactional 注释抽象类,否则它将不起作用。 Spring 文档只讨论接口。 由于我这里调用的是抽象类方法,所以也需要@Transactional。

@Transactional
public abstract class AbstractService<T extends BaseEntity> implements IService<T> {

    @Inject
    private IDao dao;

    @Override
    public void save(T entity) {
        dao.save(entity);
    }


}

【讨论】:

    猜你喜欢
    • 2012-05-19
    • 2013-11-05
    • 2019-02-18
    • 2013-04-02
    • 2023-03-24
    • 1970-01-01
    • 2017-05-04
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多