Несколько маркеров в этой строке при использовании @Transactional - PullRequest
4 голосов
/ 22 ноября 2011

например:

@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

}

Мои транзакции работают или нет? (У меня нет исключений и веб-приложение работает и методы работают)

Я не могу понять, если это сообщение об ошибке или нет?

Ответы [ 3 ]

5 голосов
/ 22 ноября 2011

Проблема с несколькими маркерами не является проблемой вообще; это чисто информационное. (Этот метод является частью реализации интерфейса или абстрактного метода, о котором вы, вероятно, уже знали, и он перехватывается AOP из-за аннотации @Transactional. Надеюсь, вас это не удивит ... )

Ошибка в том, что аннотируемый вами класс не реализует подходящий интерфейс (или интерфейсы), что необходимо для использования встроенного механизма прокси-сервера JDK для установки перехватчиков AOP в компоненте. (Перехватчики уровня бина выполняются через прокси-объект, который применяет транзакционное поведение и затем делегирует его реальному объекту.) Механизм прокси-сервера JDK работает только с интерфейсами; перехват чего-либо еще требует другого подхода.

Два возможных исправления для этого:

  1. Заставьте класс бина реализовать подходящий интерфейс, который имеет все методы вашего класса, помеченные как @Transactional.
  2. Добавьте cglib в качестве зависимости, которую Spring использует для динамической записи классов, которые осуществляют перехват. (Это умные вещи.)

Вам нужно использовать только одно из этих исправлений, а второе - очень просто , если вы используете систему сборки, такую ​​как Maven; просто обновите зависимости. (Кроме того, избегайте вызовов перехваченных методов через this, будь то явные или нет. Это обходит перехват AOP.)

2 голосов
/ 03 января 2018

У меня были такие же красные маркеры рядом с сигнатурой метода с аннотацией @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 Framework для управления транзакциями в моем приложении.

Надеюсь, вам это тоже поможет.

1 голос
/ 22 ноября 2011

Ваши транзакции будут работать при условии, что все остальное правильно.«Advised by» здесь носит исключительно информационный характер и показывает, что ваш метод рекомендуется методом Spring TransactionInterceptor.invoke.

О проблеме с несколькими маркерами, она появляется при реализации чего-либо, потому что есть две информации: первая - это "посоветовал ", а во-вторых, этот метод что-то реализует.

Если вы не уверены, я предлагаю вам написать интеграционный тест и проверить изменения в базе данных.Но вам больше ничего не нужно делать, ваш код будет работать как есть.(Если, как я уже говорил, все остальное правильно.)

...