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)

それがエラーなのか単なるメッセージなのかよくわかりません。他のスレッドを見ると、エラーとして表示されます。トランザクションが機能するかどうか心配しています。

わかりました、クラスはトランザクションとして注釈が付けられたインターフェースとそのメソッドを実装しています、それで何か問題がありますか?

更新:いくつかのマイナーエラーを解決しました。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アプリケーションが実行され、メソッドは機能します)

このメッセージエラーかどうかわかりませんか?

4

3 に答える 3

5

複数のマーカーの問題はまったく問題ではありません。それは純粋に情報提供です。(このメソッドは、おそらくすでに知っているインターフェースまたは抽象メソッドの実装の一部でありアノテーションのためにAOPによってインターセプトされ@Transactionalます。これがあなたを驚かせないことを願っています…)

エラーは、アノテーションを付けているクラスが適切なインターフェースを実装していないためです。これは、組み込みのJDKプロキシメカニズムを使用してAOPインターセプターをBeanに配置するために必要です。(Beanレベルのインターセプターは、トランザクション動作を適用してから実際のオブジェクトに委任するプロキシオブジェクトを介して実行されます。)JDKプロキシメカニズムはインターフェイスでのみ機能します。他のものを傍受するには、別のアプローチが必要です。

これに対する2つの可能な修正は次のとおりです。

  1. Beanクラスに、としてマークされているクラスのすべて@Transactionalのメソッドを持つ適切なインターフェースを実装させます。
  2. 依存関係としてcglibを追加します。これは、Springがインターセプトを行うクラスを動的に作成するために使用します。(これは賢いものです。)

これらの修正の1つを使用するだけでよく、Mavenのようなビルドシステムを使用している場合、2番目の修正は非常に簡単です。依存関係を更新するだけです。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

他のすべてが正しければ、トランザクションは機能します。ここでの「アドバイス」は純粋に情報提供であり、メソッドがSpringのTransactionInterceptor.invokeメソッドによってアドバイスされていることを示しています。

複数マーカーの問題については、何かを実装するときに表示されます。これは、2つの情報があるためです。1つは「アドバイス」であり、2つ目はこのメソッドが何かを実装していることです。

よくわからない場合は、統合テストを作成し、データベースで変更をテストすることをお勧めします。ただし、他に何もする必要はありません。コードはそのまま機能します。(前に述べたように、他のすべてが正しい場合。)

于 2011-11-22T16:52:18.827 に答える