他の開発者によって作成されたJava-EEStruts2Webアプリケーションに変更を加える必要があります。
それがどのように機能するか正確にはわからないので、変更する前にWebアプリケーションのワークフローをよりよく理解するために、各リクエストで呼び出されるすべてのアクションとメソッドをマップしたいと思います。
この目標を達成する方法はありますか?
次の方法論の1つ(または複数)を採用します。
struts.xmlを見て、構成要素(特にActions
とmethods
)がどのようにマップされ、どのようにマッピングされているかを確認し、コンパイル時のアプリケーションの動作を再現します。
スタックを通過するすべてのアクションとメソッドの名前をログに記録する(またはどこかに保存する)インターセプターを書き込み、リクエストからそれらを読み取ります。
Preparable Interfaceを実装し、メソッド内からリクエストロギングを実行しprepare()
ます;
クラス名とメソッド名を動的に取得する
Thread.currentThread().getStackTrace()[level].getMethodName();
アプリケーションの構造に応じて、この行の呼び出しを「どこかに」配置して、呼び出されたすべてのクラス名とメソッドをログに記録することができます。
この実装をお勧めします。これにより、深度レベルの問題が解決されます。
public class Utilities {
public static String getCurrentMethod() {
return getCurrentMethodNameFromThread(0);
}
public static String getCallingMethodName() {
return getCurrentMethodNameFromThread(1);
}
private static String getCurrentMethodNameFromThread(int stackLevel) {
/*
* 0 - dumpThreads
* 1 - getStackTrace
* 2 - thisMethod => getCurrentMethodNameFromThread
* 3 - callingMethod => method calling thisMethod
* 4 - method calling callingMethod
*/
StackTraceElement
stackTraceElement =
Thread.currentThread().getStackTrace()[4 + stackLevel];
String className = stackTraceElement.getClassName();
String methodName = stackTraceElement.getMethodName();
return className + "." + methodName;
}
}
すべての方法?!それとも、アプリケーションからのものだけですか?
(とにかく、私にとって)最も速くて簡単な解決策は、AOPを使用してすべてのアプリのコードをインストルメント化し、すべてのエントリをログに記録し、場合によっては終了することです。IMOこれはあなたが実際に望んでいる以上のものになりますが、それはあなたが求めているものです。この出力を取得したら、より現実的なものに絞り込むことができます。
(シーケンス図の作成など、これを使って実際にいくつかの楽しいゲームをプレイできます。)
私があなたの質問から得たように、あなたはこのように使ってみるかもしれません。
アクションクラスを見つけて、execute()
これが簡単な場合は、アプリケーションをデバッグモードで実行し、関数の最初からデバッグを開始しexecute()
ます。を押しF6
て1行ずつデバッグし、新しい関数が表示された場合は、を押して関数内にF5
移動するか、手動で関数に移動して新しいブレークポイントを配置し、を押しF6
てその関数に移動します。
それがあなたを助けることを願っています