【发布时间】: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 仅适用于外部方法调用,而不适用于内部方法调用。但是,由于您尚未添加代码,因此无法查看错误在哪里。
-
是什么让您认为它不起作用?你能分享一些代码吗?
-
我没有从同一个类中调用该方法。正如我所说,我正在使用它的接口注入服务,并使用接口调用它。我正在努力提供一些代码示例...
标签: spring transactions spring-transactions