Spring 忽略 @Transactional 注释
Posted
技术标签:
【中文标题】Spring 忽略 @Transactional 注释【英文标题】:Spring ignores @Transactional annotations 【发布时间】:2017-09-11 11:39:26 【问题描述】:似乎 spring 忽略了服务类上的 @Transactional 注释。 我读了一些q&a on SO 和blogs,但似乎没有一个选项适合我。
-
我没有调用私有方法 - 我调用的是在接口上公开的公共方法。
我正在调用不同类的方法(即不是从同一个类调用)。
我的“服务”类使用
@Component
和@Transactional
进行注释。
我的“服务类有一个接口,我正在使用该接口和@Inject
注释注入它。
我尝试添加proxy-target-class="true"
,如其中一个答案中所述 - 没有用。
我使用的是 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 仅适用于外部方法调用,而不适用于内部方法调用。但是,由于您尚未添加代码,因此无法查看错误在哪里。 是什么让您认为它不起作用?你能分享一些代码吗? 我没有从同一个类中调用该方法。正如我所说,我正在使用它的接口注入服务,并使用接口调用它。我正在努力提供一些代码示例... 【参考方案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);
【讨论】:
以上是关于Spring 忽略 @Transactional 注释的主要内容,如果未能解决你的问题,请参考以下文章
具有@async超时值的Spring @transactional不起作用
Grails @Transactional 与 Spring @Transactional 注释之间的差异
Spring - @Transactional - 在后台发生了啥?