我有以下代码:
@Service
public class ItemService {
...
public void addItems(@Nonnull DocumentDTO dto) throws Exception {
// some code that takes some time to process
...
addItems(dto.getDocId(), items);
}
@Transactional
public void addItems(long docId, @Nonnull List<Item> items) {
itemDao.addItems(docId, items);
}
}
第一个方法不是@Transactional,它使用@Transactional调用第二个方法。SonarLint工具指出“方法不应使用不兼容的“ @Transactional”值调用同类方法”(https://rules.sonarsource.com/java/RSPEC-2229)
但是此代码在Spring 4.3.20中正常工作。这条规则对Spring 4.3.20有用吗?
P.S。有趣的是,如果我将第二种方法设置为package-private,则SonarLint警告消失了……为什么?
当不需要交易时,它可能会正常工作。 @Transactional
仅适用于在spring创建的代理上调用的方法。这意味着,当您创建@Service
或其他bean时,从外部调用的方法将是事务性的。如果从bean中调用,则不会发生任何事情,因为它不会通过代理对象传递。
有关更多详细信息,请参见this question。