Spring忽略@Transactional注释

时间:2017-09-11 11:39:27

标签: spring transactions spring-transactions

看起来像spring忽略服务类上的@Transactional注释。 我读了一些q&a on SOblogs,但没有一个选项对我有效。

  1. 我不是在调用私有方法 - 我调用在接口上公开的公共方法。
  2. 我在另一个类上调用一个方法(即不从同一个类调用)。
  3. 我的“服务”类使用@Component@Transactional注释。
  4. 我的“服务类有一个界面,我正在使用界面注入它,并@Inject注释。
  5. 我尝试在其中一个答案中添加proxy-target-class="true",但没有效果。
  6. 我正在使用JAX-RS(不是spring-mvc)。
  7. 当我收到此异常时,错误发生在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);
        }
    }
    

    有任何想法或建议吗?

1 个答案:

答案 0 :(得分: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);
    }


}