はじめに
前回はアプリケーションサーバにデバッガをアタッチする方法までを説明しました。
今回は、ソースコードを眺めているだけでは通ることを見つけにくい(のでbreakポイントを仕掛け忘れがちな)クラス/メソッドについてリストにしていきます。
ポイント: xmlファイルを見逃さないようにする
私自身もそうなのですが、 .java
ファイルにはよく注意を向けていても、 .xml
ファイルを見忘れていることがよくあります。
しかし、Javaアプリケーションフレームワークのコア設定は .xml
ファイルのみで行えることも多いです。現代はなまじアノテーションでも同様の設定ができるようになったため、余計に見落としがちになったようにも思われます。
アプリケーションサーバ特有の .xml
ファイルなんかもあり私は全て網羅することができませんが、とにかくどういう .xml
ファイルがバージョン管理されているかは一度は全数確認してみた方が良いでしょう。
重要な .xml
ファイルの典型的な一例:
-
アプリケーションサーバ特有の設定ファイル(例えばWiildFlyなら
jobss-web.xml
) -
ejb-jar.xml
(ejb) -
web.xml
(ほぼ全て) -
faces-config.xml
(JSF) -
beans.xml
(CDI) -
applicationContext.xml
(Spring Framework)
体系的でなく思いつくままになりますが、書いていきたいと思います。
どんな(オレオレ)フレームワークを使っているか: web.xml
Javaにおいて、いわゆるオレオレフレームワークはServletコンテナを用いた Fornt Controller Pattern で実現されることが一般的です。
そういったフレームワークとServletコンテナとの接続ポイントが、 web.xml
で設定されます。ですので、 web.xml
にかかれているクラス名を見れば利用されているフレームワークの種類がわかります。
ちなみに、Java EEアプリケーションサーバ(例えばWildFLy)上で動作させる前提の場合、標準で組み込まれているJSFやCDIについては上記の設定が不要です。
起動時処理(等): @PostConstgruct
javax.annotation.PostConstruct
アノテーションは EJB, CDI, Spring Bean 等様々な箇所で有効です。
Application-scoped や Singleton-scoped なBeanに付与することでアプリケーション起動時に1回処理するための実装として用いられていることがあります。
起動時に何かやっているはずだけどどこで実装されているんだろう…?と思ったときはソースコードを "@PostConsturct" で検索してみると何かわかるかもしれません。
Servlet fileter, Servlet listener
前述の通り、大半のJavaアプリケーションサーバはServletコンテナ上で実現されています。
クライントからのイベントに対して何か共通処理を施したい場合、最も一般的なものが Filter(、同様にアプリケーションからのイベントを処理するのが Listener) になります。
それぞれ、 web.xml
の fileter
, listener
セクションで設定する他、アノテーション @WebFilter
, @WebListener
で設定することもできます。
クライアントからのリクエストを処理しているメソッドで、何か前処理が挟まっているような挙動を示しているがどこで実装されているかわからない…というような場合はこれを検索してみると良いかもしれません。
常に有効化したい場合はアノテーションで、development/prodcutionといった環境で使い分けたい場合は web.xml
で、というような設定が行われているようなアプリケーションも見たことがありますので、片方だけ見ても全数が把握できていない可能性がありますので気をつけてください。
JSF phase listener
自分ではJSF開発したことがなく、JSFを使っているアプリケーションをデバッグしたことがあるだけなので詳細を説明することができませんが、前述Servlet listnerのJSF版のようなものです。特定のタイミングでlistnerがイベントを受けることができるので、そこで実行したい処理を実装します。
これは faces-config.xml
で設定しますのでこのファイルを見ればクラスが判明します。
インターセプタ
インターセプタは特定のメソッドを実行する前後に、事前に設定しておいた処理を挟める機構です。
これはフレームワークごとに様々なバリエーションがあるので、そのフレームワークについて知っていないと見つけるのが難しい部類になります。クラスの命名は慣例的に"Interceptor"を接尾に付与することが多いので、これが手がかりになるかもしれません。