使用@Transactional时,此行上有多个标记

问题描述 投票:4回答:3

例如:

@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应用程序运行,方法工作)

我无法理解这条消息是否错误?

spring markers transactional
3个回答
5
投票

多个标记的问题根本不是问题;这纯粹是信息性的。 (该方法是您可能已经知道的接口或抽象方法的实现的一部分,并且由于@Transactional注释它被AOP拦截。我希望这不会让您感到惊讶......)

这个错误是因为你要注释的类没有实现一个合适的接口(或接口),这是使用内置的JDK代理机制将AOP拦截器放在bean中的必要条件。 (Bean级拦截器通过应用事务行为的代理对象完成,然后委托给真实对象。)JDK代理机制仅适用于接口;拦截其他任何东西都需要采用不同的方法。

对此的两个可能的解决方案是:

  1. 使bean类实现一个合适的接口,该接口具有类的所有方法,标记为@Transactional
  2. 添加cglib作为依赖项,Spring使用它来动态编写执行拦截的类。 (这是聪明的东西。)

你只需要使用其中一个修复程序,如果你使用像Maven这样的构建系统,第二个就很容易;只需更新依赖项。 (另外,避免通过this调用截获的方法,无论是否明确。这样可以截取AOP拦截。)


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框架来管理我的应用程序中的事务。

希望它也会对你有所帮助。


1
投票

如果其他一切都正确,您的交易将有效。 “建议”这里纯粹是信息性的,并表明spring的TransactionInterceptor.invoke方法建议你的方法。

关于多个标记问题,它会在你实现某些东西时出现,因为有两个信息:第一个是“建议者”,第二个是这个方法正在实现的东西。

如果您不确定,我建议您编写集成测试并测试数据库中的更改。但是您不必执行任何其他操作,您的代码将按原样运行。 (如果我之前说过,其他一切都是正确的。)

© www.soinside.com 2019 - 2024. All rights reserved.