Servlet3.0の@WebFilterの微妙な点

ボルダリングじゃなくて久々に本業系のエントリ!でもボルダラーって結構IT系の人が多いので意外と通じる?
#関係ないけどセッションってIT界隈でもボルダリング界隈でもある単語ですよね!

今年は新入社員のインストラクターになったので、色々とエンプラ系Javaのイロハを教育中なのだけども。その中でServletでいろいろ作って勉強しましょうということで。。久々に演習問題を作っていると、Tomcatは最新ではバージョンは7になっていて、Servlet3.0に追いついて、その目玉機能として、EoDとして「Annotation based configuration」が新しく定義されている。アノテーションを利用することでServletの開発が簡単になるという。いいね!自分が大分世の中から周回遅れにされていることがわかってショックだったけど、さっそく使ってみよう!

例えば、Servletの実行時間を測定するFilterで下記のようなものを作ってみるとか。

その後、FilterをChainさせて奥のほう(Servlet側)で例外をスローさせて下記のようなスタックトレースを眺めさせてChainの構造を考察&理解させようと思っていたのだけど、、、。

8 04, 2014 7:26:52 午後 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: サーブレット org.sasaki.Problem2 のServlet.service()が例外を投げました
java.lang.RuntimeException
at org.defenceless.filter.MeasuringTimeFilter.doFilter(MeasuringTimeFilter.java:47)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.defenceless.filter.ExceptionFilter.doFilter(ExceptionFilter.java:40)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.defenceless.filter.AnotherFilter.doFilter(AnotherFilter.java:40)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
(略)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:724)

ん、、アノテーションのAPIとして順番を指定するような仕様がない。。色々と調べてみると、下記の記事発見。

How to define Servlet filter order of execution using annotations

う~む。。。結局、Filterの刺さる順序をアノテーションでは指定できない。結局Web.xmlに書くしかない。。順番指摘できないFilter誰が使うのだろうか!?