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
}
代码编译和运行没有问题

消息本身:此行有多个标记

  • 工具
com.pname1.pname2.pname3.pname4.PersonDAO.addPersonToDb

  • 建议
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)

我真的不明白这是一个错误还是一条消息,看看其他线程,人们会认为这是一个错误。我只是担心我的交易是否有效

好的,这个类实现了接口及其被注释为事务的方法,有什么问题吗

更新:解决了一些小错误,web应用程序运行正常,但我仍然收到了该消息(不是在堆栈跟踪中,而是在行断点上):

建议 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应用程序运行和方法正常)


我无法理解此消息是否有错误?

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

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

有两种可能的修复方法:

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

  • 您只需要使用其中一个补丁,如果您使用的是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。这段代码将按原样工作,前提是其他一切都是正确的。这两种解决方案都不适合我。还有什么其他办法可以摆脱这种“周围的建议标记”的警告吗?谢谢,请不要否决以前的答案,这是正确的,我之前有一个错误已经解决了,这是我愚蠢的困惑。当像这些建议标记器这样的东西第一次出现时,我会发疯(控制狂):-)