問題タブ [spring-aspects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
spring - Spring Boot、@Configurable LoadTimeWeaving、Tomcat 8 - IllegalStateException
私の Spring Boot 1.3.3、Tomcat 8 (開発用組み込み、本番用スタンドアロン) アプリケーションでは、Spring Proxy トランザクション モードから AspectJ トランザクションに移行します。
次のアプリケーション構成を追加しました。
しかし、Embedded Tomcat 8 でのアプリケーションの起動中に (スタンドアロン Tomcat でテストしないでください)、次の例外が発生しました。
構成のどこが間違っているか、またはこの問題を解決するにはどうすればよいですか?
java - @PostConstruct と @Retryable を一緒に使用できないのはなぜですか?
を使用して、Spring Framework ベースのアプリケーションを作成しましたAnnotationConfigApplicationContext。
1 つの Bean には、外部サービスへの接続を作成する init メソッドがあります。@PostConstructこれは、Bean が開始されると自動的に実行されるように注釈を付けることができます。
この接続を作成するときに例外を処理するには、例外がキャッチされた場合に init メソッドを最大 5 回再試行する必要があります。メソッドに両方の注釈を付けると@PostConstruct、@Retryable例外が1回スローされ、プログラムが終了することがわかります-@Retryable効果がないように見えます。
@EnableRetryと一緒に構成クラスで正しく使用しました@Configuration。再試行可能として注釈が付けられた同じ Bean に別のメソッド B を作成しました。Bean がインスタンス化された後にこのメソッドが呼び出されると、例外がスローされたときにメソッドが再試行され、期待どおりに動作することがわかります。
なぜこれが機能しないのかについての私の考えは、おそらくアスペクトに関連するものであるか、またはスプリング再試行要素がアタッチされる前にポストコンストラクトが発生するのでしょうか?
メソッドでプログラムで試すのではなく、例外を処理し、注釈を介して再試行できる初期化メソッドを持つより良い方法は実際にありますか?
編集: 外部サービスへの接続の作成は 経由で行うべきではないことに同意します@Postconstruct。これにより、再試行が失敗した場合にコンテキスト全体の初期化が停止し、悪影響が生じる可能性があります。
ただし、これは、Spring Framework のどの部分がこれら 2 つのアノテーションを連携させないのかという問題にはまだ答えていません。
spring - Springを使用するアプリケーションで@AspectJアスペクトが織り込まれていない
<context:load-time-weaver/>
次の行を application-context.xml に追加しました。
META-INF\aop.xml次のファイルを作成しました。
それが機能しているかどうかを簡単に確認するためのキャッチオールを含む側面:
しかし、何も起こらないようです。何かアイデアはありますか?
spring - Spring AOP は一部のクラスを除外します
メソッド実行統計のロギングにSpring AspectJを使用していますが、ポイントカット式を変更せずに、いくつかのクラスとメソッドをこれから除外したいと考えています。
特定のメソッドを除外するために、フィルターで除外するために使用するカスタム アノテーションを作成しました。ただし、クラスで同じことを行うことはできません。
ここに私のアスペクト定義があります -
NoLoggingメソッドを除外するための私のカスタム注釈です。
では、ポイントカット式を変更したり、新しいアドバイザーを追加したりせずに、特定のクラスを除外するにはどうすればよいでしょうか?
spring - Spring MVC および AOP: @Controllers の @Pointcuts はテストでのみ機能し、本番環境では機能しません
私は Web 環境で Spring Framework 4.3.3 を使用しています。
私は2つのコンテキストを持っています:
RootApplicationContextServletApplicationContext
ServletApplicationContextたとえば、Web 側に関するすべての Bean が含まれていることはわかっています@Controller。さらに、たとえばなどServletApplicationContextからすべてのコンテキストまたは Bean にアクセスできます。ここまでは問題ありません。RootApplicationContext@Service, @Repository
@Configurationクラスにも適用されることに注意してください。(インフラストラクチャー)
したがって、前の紹介では、次のように考えることができます。
ServletApplicationContext-->RootApplicationContext
考慮すべき重要なことは、逆は不可能だということです。
したがって
RootApplicationContext-->ServletApplicationContext
できません。センスがあってOKです。サーバー側は Web 側にアクセスすべきではありません
AspectJについて。私は次のものを持っています:
ここで 1 つの重要なポイント:
- これ
AopConfigはによってスキャンされますRootApplicationContext- のアクセスを通じてそれ
ServletApplicationContextを参照できると信じています@ConfigurationRootApplicationContext
- のアクセスを通じてそれ
わかりました、@Testメソッドを実行すると。
私が使用するサーバー側から Test クラスを実行するとき
@ContextConfiguration(classes={RootApplicationContext.class} )- それだけ
RootApplicationContext
- それだけ
そして、AOPは正常に動作します。AOP + logging次のプロセスで確認できます。
@Service->@Repository
Web 側から Test クラスを実行するときは、次を使用します。
@ContextConfiguration(classes={RootApplicationContext.class, ServletApplicationContext.class})RootApplicationContextとServletApplicationContext
そして、AOPは正常に動作します。AOP + logging次のプロセスで 確認できます。
@Controller->@Service->@Repository
今、生産のために私は持っています:
しかし、プロジェクトを.warファイルにエクスポートし、URL/URI を介してController実行すると、期待される動作またはプロセスが正常に動作します。しかし、AOP についてAOP + loggingは、次のプロセスが発生します。
@Service->@Repository
@Controller出力には表示されません。予想されるフロー プロセスは次のようになります。
@Controller->@Service->@Repository
では、なぜ本番環境ではなく、テスト環境で機能するのでしょうか?
私はすでに調査を行っており、次の2つの投稿を見つけました。
実際には、@Configurationクラスは@EnableAspectJAutoProxyスキャンする必要があり、スキャンする必要はないと言ってServletApplicationContextいますRootApplicationContext
それが正しい場合でも (新しい実験によると)、サーバー側は Web 環境なしでテストする必要があると考えてください。
その他のインフラストラクチャについては、すでに説明した関係@Beanを通じて、作品についてどのように期待されますか。AOPだけでこの状況があります。@ConfigurationServletApplicationContext --> RootApplicationContext
質問 01 : では、なぜこのような振る舞いをするのでしょうか?
質問 02AopConfig :スキャンを維持し、RootApplicationContext本番環境で期待される動作を取得するにはどうすればよいですか?
AopConfigによってスキャンされたかどうかに注意ServletApplicationContextしてください。テストに関する次のことは、サーバー側で有効かつ必須@ContextConfiguration(classes={RootApplicationContext.class, AopConfig.class} )です。の追加を参照しAopConfig.classてAopConfigくださいRootApplicationContext。
spring-mvc - Spring MVC および AOP: @Pointcuts は Rest コントローラーにのみ適用され、一般的な Web コントローラーには適用されません
Web 環境でSpring Framework4.3.3 を使用しています。
私は、依存関係以外の方法を目的として使用する を介したリクエストに@Controller使用されています。後者は、などを使用しています...WebWeb Browser@ControllerRest@Service
「Rest」を使用した「Web」に関するこのアプローチは、セクションのSpring MVC を使用したコンテンツ ネゴシエーションで説明されていCombining Data and Presentation Formatsます。ここまでは、開発/テストおよび本番環境で正常に動作します。価値のあるアプローチです。
注と を使用しているため、クラスRestには と注釈が付けられています。@ControllerResponseEntity<?>@ResponseBody
問題はAOP
私が持っているそのインフラストラクチャについて:
sについて、@Controller次の 2 つのクラスがあります。
PersonaDeleteOneControllerと:deleteOne(@PathVariable String id, Model model)為に@GetMappingdeleteOne(@PathVariable String id, RedirectAttributes redirectAttributes)為に@DeleteMapping
PersonaRestControllerdeleteOne(@PathVariable String id)為に@DeleteMapping
これら 2 つのクラスは、次の名前の同じパッケージ内で宣言されています。
com.manuel.jordan.controller.persona
私は次のものを持っています@Pointcut:
これ@Pointcutは、次のアドバイスに使用されます。
テストを実行すると、次のパターンが出力されるRestことを確認できます。AOP + logging
@Controller(残り) ->@Service->@Repository
ここまでのすべての作業はどのように期待されますか
テストを実行すると、次のパターンが出力されるWebことを確認できます。AOP + logging
@Controller(残り) ->@Service->@Repository
私が必要または期待しているのは次のとおりです。
@Controller(ウェブ) ->@Controller(レスト) ->@Service->@Repository
何が間違っているか、または不足していますか?. deleteOneシグニチャーは、そのパラメーターについてあいまいではありません。
プロダクションの場合も同じです。
アルファ
ここにコントローラーがあります:
と
this.メソッド呼び出しの実行に使用していないことがわかります。
aop - Spring AOP: 他の @Pointcuts/advices からの実行による不要な @Pointcut (@Around アドバイス) の実行を除外する方法
私は働いています:
Spring Framework4.3.3AspectJ1.8.9
次の通常のプロセスがあります。
@Controller->@Service->@Repository
について次のペアがありますAOP。
PersonaServicePointcutPersonaServiceAspect
シナリオは次のとおりです。
このクラスには、、 、@Serviceなどのメソッドが あります。それらは同じクラス内で一緒に宣言されます。deletesaveupdatefindOneById
deleteand updatethroughなどのメソッドについては、 orアドバイスをAOP使用してメソッドを呼び出しています。@Before@AroundfindOneById
その理由は、エンティティが存在しない場合にorメソッドを実行しても意味がないからです (Rest シナリオを検討してください)。したがって、例外をスローする必要があるため、 Exception Aとしましょう。deleteupdateadvice@ControllerAdvice
この方法については、実質的に同じアプローチsaveが適用されています。したがって、メソッドを実行する前に、メソッドを再度呼び出して他saveのメソッドまたはアドバイスを実行します。エンティティが既に存在する場合は、例外をスローする必要があります。たとえば、 Exception Bをスローする必要があります。 @Before@AroundfindOneById@ControllerAdvice
この方法を使用する 3 つのポイント/3 つのアドバイスがあることに注意してfindOneByIdください。エンティティが存在するかどうかを確認します。
例えば:
繰り返しますが、これら 3 つのアドバイスはメソッドを使用または実行しfindOneByIdます。
問題は、次のような新しいポイントカットを追加するときです。
このポイントカットを作成して、エンティティが既に存在するかどうかを確認しました。存在しない場合は、タイプの例外をスローする必要がありますC(従来の 404 の場合)。
メソッド自体のまたはアドバイスを介してメソッドを実行するのは冗長なようです。しかし、これは目的とタイプ C の例外を作成するためにも必要です。一部の人が処理する必要がありますfindOneById@Before@AroundfindOneByIdloggingaudit@ControllerAdvice
問題は、メソッドの他のアドバイスが実行されるときです (メソッドも呼び出して実行することdelete/update/saveを思い出してください) my is execute unnecessarily .findOneByIdfindOneByIdPointcut
次のようなことを示すようにポイントカット宣言を変更する必要があります。
どこAlphaにある:
@ServiceのfindOneByIdメソッドの before/around アドバイスを実行しますが 、その呼び出しがクラスの他のアドバイスから実行された場合は決して実行しません。
PersonaServiceAspect
!executionとの!within組み合わせで多くの方法を試しましたが、結果はありません。
のすべてのメソッドをそれぞれ固有のアドバイスでインターセプトするPointcut を1 つだけ作成した場合でも、パラメーターを使用して、どのメソッドが呼び出されたかを確認し、それぞれの制御を行うことができます。しかし、再びこの動作が発生します。 @Service@AroundProceedingJoinPoint proceedingJoinPoint
これは、次のことを意味します。
どこanyMethodPointcutですかexecution(* mypackage.PersonaServiceImpl.*(..))
このアプローチを達成することは可能ですか?どのように?
ありがとう。
spring - スプリング アプリケーションでの非スプリング Bean のロード時間ウィービング
いくつかの REST コントローラー、サービス クラス、およびヘルパー クラスを備えたスプリング ブート アプリケーションがあります。コントローラーとサービス クラスはスプリング管理されていますが、ヘルパー クラスはスプリング管理されておらず、ほとんどが静的メソッドを含んでいます。
AspectJ 構成は、次のように Java 構成に存在します。
対応する LoggingAspect クラスは次のとおりです。
- コントローラーが呼び出されると、アスペクト対応のログはコントローラーとサービス関数に対して機能しますが、ヘルパー関数に対しては機能しません。
- コントローラーでヘルパー クラスをオートワイヤーすると、非静的ヘルパー メソッドが aspectj ログを表示し始めます。ただし、静的ヘルパー メソッドはまだ aspectj ログを表示しません。
質問、1.Spring で管理されていないクラス、つまり @Bean、@Autowired、@Component などを使用しないクラスのアスペクトアドバイスを構成するにはどうすればよいですか。 2.静的メソッドのアスペクトアドバイスを構成するにはどうすればよいですか3. 可能であれば、AspectJ の設定は Java ベースにする必要があります
詳細が必要な場合はお知らせください