例如:
@Transactional
public boolean addPersonToDb(Person p) { // message on this line
//some logic
}
代码编译并运行没有问题。
消息本身:此行有多个标记
com.pname1.pname2.pname3.pname4.PersonDAO.addPersonToDb
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)
我无法理解这是一个错误还是只是一条消息,看着其他线程的人将其视为错误。如果我的交易有效,我只是担心。
好的,该类实现了接口及其方法注释为事务性,有什么不对吗?
更新:解决了一些小错误,网络应用程序正常工作,但我仍然收到该消息(不在堆栈跟踪中,但在行断点处):
建议 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)
现状:
@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应用程序运行,并且方法有效)
我无法理解这条消息是否错误?
答案 0 :(得分:5)
多个标记的问题根本不是问题;它纯粹是信息性的。 (该方法是接口或抽象方法的实现的一部分,您可能已经知道,和由于@Transactional
注释而被AOP截获。我希望这不是&#39 ;让你大吃一惊......)
错误是因为您要注释的类没有实现合适的接口(或接口),这是使用内置JDK代理机制将AOP拦截器放在bean中的必要条件。 (Bean级拦截器通过应用事务行为的代理对象完成,然后委托给真实对象。)JDK代理机制仅适用于接口;拦截其他任何东西都需要采用不同的方法。
对此的两个可能的解决方案是:
@Transactional
。如果您正在使用像Maven这样的构建系统,那么您只需要使用其中一个修补程序,第二个修补程序非常简单;只需更新依赖项。 (另外,避免通过this
调用截获的方法,无论是否明确。这样可以截取AOP拦截。)
答案 1 :(得分:2)
我在上面带有@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框架来管理我的应用中的交易。
希望它也能帮到你。