Spring忽略了@Transactional注解

3
似乎Spring忽略了服务类上的@Transactional注解。我在SO上阅读了一些问题和回答以及博客, 但没有一个选项适用于我。
  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);
    }
}

任何想法或建议?

2
如果您正在同一类上调用方法,则这些都无关紧要。AOP仅适用于外部方法调用而不是内部方法调用。但是,由于您尚未添加代码,因此无法看到错误发生的位置。 - M. Deinum
你觉得它为什么不起作用?能分享一些代码吗? - Leffchik
我并不是从同一个类中调用该方法。正如我所说,我是通过接口注入服务,并使用接口调用它。 我正在努力提供一些代码示例... - Elad Tabak
1个回答

2
所以事实证明我还必须在抽象类上注释@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);
    }


}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接