問題タブ [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つのコンテキストを持っています:
RootApplicationContext
ServletApplicationContext
ServletApplicationContext
たとえば、Web 側に関するすべての Bean が含まれていることはわかっています@Controller
。さらに、たとえばなどServletApplicationContext
からすべてのコンテキストまたは Bean にアクセスできます。ここまでは問題ありません。RootApplicationContext
@Service, @Repository
@Configuration
クラスにも適用されることに注意してください。(インフラストラクチャー)
したがって、前の紹介では、次のように考えることができます。
ServletApplicationContext
-->RootApplicationContext
考慮すべき重要なことは、逆は不可能だということです。
したがって
RootApplicationContext
-->ServletApplicationContext
できません。センスがあってOKです。サーバー側は Web 側にアクセスすべきではありません
AspectJについて。私は次のものを持っています:
ここで 1 つの重要なポイント:
- これ
AopConfig
はによってスキャンされますRootApplicationContext
- のアクセスを通じてそれ
ServletApplicationContext
を参照できると信じています@Configuration
RootApplicationContext
- のアクセスを通じてそれ
わかりました、@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だけでこの状況があります。@Configuration
ServletApplicationContext --> 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 Framework
4.3.3 を使用しています。
私は、依存関係以外の方法を目的として使用する を介したリクエストに@Controller
使用されています。後者は、などを使用しています...Web
Web Browser
@Controller
Rest
@Service
「Rest」を使用した「Web」に関するこのアプローチは、セクションのSpring MVC を使用したコンテンツ ネゴシエーションで説明されていCombining Data and Presentation Formats
ます。ここまでは、開発/テストおよび本番環境で正常に動作します。価値のあるアプローチです。
注と を使用しているため、クラスRest
には と注釈が付けられています。@Controller
ResponseEntity<?>
@ResponseBody
問題はAOP
私が持っているそのインフラストラクチャについて:
sについて、@Controller
次の 2 つのクラスがあります。
PersonaDeleteOneController
と:deleteOne(@PathVariable String id, Model model)
為に@GetMapping
deleteOne(@PathVariable String id, RedirectAttributes redirectAttributes)
為に@DeleteMapping
PersonaRestController
deleteOne(@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 Framework
4.3.3AspectJ
1.8.9
次の通常のプロセスがあります。
@Controller
->@Service
->@Repository
について次のペアがありますAOP
。
PersonaServicePointcut
PersonaServiceAspect
シナリオは次のとおりです。
このクラスには、、 、@Service
などのメソッドが あります。それらは同じクラス内で一緒に宣言されます。delete
save
update
findOneById
delete
and update
throughなどのメソッドについては、 orアドバイスをAOP
使用してメソッドを呼び出しています。@Before
@Around
findOneById
その理由は、エンティティが存在しない場合にorメソッドを実行しても意味がないからです (Rest シナリオを検討してください)。したがって、例外をスローする必要があるため、 Exception Aとしましょう。delete
update
advice
@ControllerAdvice
この方法については、実質的に同じアプローチsave
が適用されています。したがって、メソッドを実行する前に、メソッドを再度呼び出して他save
のメソッドまたはアドバイスを実行します。エンティティが既に存在する場合は、例外をスローする必要があります。たとえば、 Exception Bをスローする必要があります。 @Before
@Around
findOneById
@ControllerAdvice
この方法を使用する 3 つのポイント/3 つのアドバイスがあることに注意してfindOneById
ください。エンティティが存在するかどうかを確認します。
例えば:
繰り返しますが、これら 3 つのアドバイスはメソッドを使用または実行しfindOneById
ます。
問題は、次のような新しいポイントカットを追加するときです。
このポイントカットを作成して、エンティティが既に存在するかどうかを確認しました。存在しない場合は、タイプの例外をスローする必要がありますC
(従来の 404 の場合)。
メソッド自体のまたはアドバイスを介してメソッドを実行するのは冗長なようです。しかし、これは目的とタイプ C の例外を作成するためにも必要です。一部の人が処理する必要がありますfindOneById
@Before
@Around
findOneById
logging
audit
@ControllerAdvice
問題は、メソッドの他のアドバイスが実行されるときです (メソッドも呼び出して実行することdelete/update/save
を思い出してください) my is execute unnecessarily .findOneById
findOneByIdPointcut
次のようなことを示すようにポイントカット宣言を変更する必要があります。
どこAlpha
にある:
@Service
のfindOneById
メソッドの before/around アドバイスを実行しますが 、その呼び出しがクラスの他のアドバイスから実行された場合は決して実行しません。
PersonaServiceAspect
!execution
との!within
組み合わせで多くの方法を試しましたが、結果はありません。
のすべてのメソッドをそれぞれ固有のアドバイスでインターセプトするPointcut を1 つだけ作成した場合でも、パラメーターを使用して、どのメソッドが呼び出されたかを確認し、それぞれの制御を行うことができます。しかし、再びこの動作が発生します。 @Service
@Around
ProceedingJoinPoint proceedingJoinPoint
これは、次のことを意味します。
どこanyMethodPointcut
ですかexecution(* mypackage.PersonaServiceImpl.*(..))
このアプローチを達成することは可能ですか?どのように?
ありがとう。
spring - スプリング アプリケーションでの非スプリング Bean のロード時間ウィービング
いくつかの REST コントローラー、サービス クラス、およびヘルパー クラスを備えたスプリング ブート アプリケーションがあります。コントローラーとサービス クラスはスプリング管理されていますが、ヘルパー クラスはスプリング管理されておらず、ほとんどが静的メソッドを含んでいます。
AspectJ 構成は、次のように Java 構成に存在します。
対応する LoggingAspect クラスは次のとおりです。
- コントローラーが呼び出されると、アスペクト対応のログはコントローラーとサービス関数に対して機能しますが、ヘルパー関数に対しては機能しません。
- コントローラーでヘルパー クラスをオートワイヤーすると、非静的ヘルパー メソッドが aspectj ログを表示し始めます。ただし、静的ヘルパー メソッドはまだ aspectj ログを表示しません。
質問、1.Spring で管理されていないクラス、つまり @Bean、@Autowired、@Component などを使用しないクラスのアスペクトアドバイスを構成するにはどうすればよいですか。 2.静的メソッドのアスペクトアドバイスを構成するにはどうすればよいですか3. 可能であれば、AspectJ の設定は Java ベースにする必要があります
詳細が必要な場合はお知らせください