Spring 使用@Transactional时,此行有多个标记
例如:Spring 使用@Transactional时,此行有多个标记,spring,markers,transactional,Spring,Markers,Transactional,例如: @Transactional public boolean addPersonToDb(Person p) { // message on this line //some logic } 代码编译和运行没有问题 消息本身:此行有多个标记 工具 com.pname1.pname2.pname3.pname4.PersonDAO.addPersonToDb 建议 org.springframework.transaction.interceptor.TransactionIn
@Transactional
public boolean addPersonToDb(Person p) { // message on this line
//some logic
}
代码编译和运行没有问题
消息本身:此行有多个标记
- 工具
- 建议
@Transactional
public void registerNewUser(Person p) { // this gives message on line breakpoint - advised by ...; AND this method is implemented by interface
pd.addPersonToDb(p);
}
@Transactional
public void blabla(Person p){ // this does not, as expected; AND it is not in interface
}
我的交易是否有效?(我没有例外,web应用程序运行和方法正常)
我无法理解此消息是否有错误?多个标记的问题根本不是问题;这纯粹是信息。(该方法是接口或抽象方法实现的一部分,您可能已经知道了,它被AOP拦截,因为
@Transactional
注释。我希望这不会让您感到惊讶……)
错误是因为您正在注释的类没有实现合适的接口,这对于使用内置JDK代理机制将AOP拦截器放置在bean中是必要的。(Bean级拦截器是通过一个代理对象完成的,该代理对象应用事务行为,然后委托给真实的对象。)JDK代理机制仅适用于接口;拦截任何其他内容都需要不同的方法
有两种可能的修复方法:
@Transactional
的所有方法您只需要使用其中一个补丁,如果您使用的是Maven这样的构建系统,那么第二个补丁非常简单;只需更新依赖项。(另外,避免通过
this
调用被截获的方法,无论是否显式。该方将执行AOP截获。)如果其他所有操作都正确,您的事务将正常工作。这里的“Advised by”纯粹是信息性的,表明您的方法是由spring的TransactionInterceptor.invoke方法建议的
关于多标记问题,它会在您实现某个东西时出现,因为有两个信息:第一个是“建议人”,第二个是此方法正在实现某个东西
如果您不确定,我建议您编写一个集成测试并测试数据库中的更改。但您不必做任何其他事情,您的代码将按原样工作。(如我前面所述,如果其他一切都是正确的。)我在上面带有
@Transactional
注释的方法签名旁边有相同的红色标记
@Override
@Transactional
public void updateBook(Book book) {
bookDao.updateBook(book);
}
这些标记的信息如下
这条线上有多个标记
-实现bookmanager.service.BookService.updateBook
-建议
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)
我的修复方法是,我将这个注释@org.springframework.transaction.annotation.Transactional
替换为以下注释@javax.transaction.Transactional
我使用Hibernate框架来管理应用程序中的事务
希望它也能帮助你。没关系。使方法实现具有事务性,即使实现的方法本身不是事务性的。这意味着问题在别处。你能粘贴完整的堆栈跟踪吗?我使用maven,我添加了cglib,但现在每当我尝试在实现类中注释接口实现的方法时,我都会得到这样的建议,但是当我在其他方法上使用事务方法(未在实现的接口中指定)时,一切都正常。为什么我不能对接口实现的方法进行注释?我不知道哪里出了问题,但我确信,当我做这种事情时,它对我来说很好。我将CGLIB包含在我的依赖项中,并让Spring解决所有问题……我必须承认,您的描述对我来说很难,所以这个消息可以是,也可以不是?现在我没有任何异常,只有这条消息在行断点上。请参阅更新的答案:-)在实现的方法中不需要@Transactional。这段代码将按原样工作,前提是其他一切都是正确的。这两种解决方案都不适合我。还有什么其他办法可以摆脱这种“周围的建议标记”的警告吗?谢谢,请不要否决以前的答案,这是正确的,我之前有一个错误已经解决了,这是我愚蠢的困惑。当像这些建议标记器这样的东西第一次出现时,我会发疯(控制狂):-)