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

时间:2011-11-22 14:12:48

标签: 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.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应用程序运行,并且方法有效)

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

2 个答案:

答案 0 :(得分:5)

多个标记的问题根本不是问题;它纯粹是信息性的。 (该方法是接口或抽象方法的实现的一部分,您可能已经知道,由于@Transactional注释而被AOP截获。我希望这不是&#39 ;让你大吃一惊......)

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

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

  1. 使bean类实现一个合适的接口,该接口具有 all 类的方法,标记为@Transactional
  2. 添加cglib作为依赖项,Spring使用它来动态编写执行拦截的类。 (这是聪明的东西。)
  3. 如果您正在使用像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框架来管理我的应用中的交易。

希望它也能帮到你。