4

例如:

@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)

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

好的,该类实现了接口,并且它的方法被注释为 transactional ,这有什么问题吗?

更新:解决了一些小错误,网络应用程序可以工作,但我仍然收到该消息(不是在堆栈跟踪中,而是在断点处):

由 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 应用程序运行并且方法有效)

我不明白这条消息是否错误?

4

3 回答 3

5

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

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

两个可能的解决方法是:

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

您只需要使用其中一个修复程序,如果您使用的是 Maven 之类的构建系统,则第二个修复程序非常容易;只需更新依赖项。(另外,避免通过 调用被拦截的方法this,无论是否显式。这会避开 AOP 拦截。)

于 2011-11-22T15:31:38.903 回答
3

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

希望它也能帮助你。

于 2018-01-03T11:11:34.447 回答
1

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

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

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

于 2011-11-22T16:52:18.827 回答