NetBeansでT2 0.3をセットアップしてみる ・・・バグ発見

T2とは・・・id:shot6さんの作ってるフレームワークで詳しくはこちらをみるのがよろしい。


EclipseプロジェクトということでNetBeansプロジェクトは用意されてはいない。ただ、NetBeansは素直に既存のコードからAntやプロジェクトをすべて自動生成してくれるため修正は容易だ。

今回はサンプルを動かしてみる。

プロジェクトの作成前の準備

まずは適当にプロジェクト用のディレクトリを作成し、そこにソース、ライブラリ、webとわけて格納する。WEB-INFの下にのクラスやソースライブラリをおくと問題が発生する可能性があるのでやめよう。あの部分は設定を元に自動で生成される場所であってユーザーは意識しない箇所なのだ。


ライブラリの中をのぞくと不要なファイルがある。TomcatGlassfishなどアプリケーションサーバーを使って開発するのなら標準ライブラリを別途用意することはしない。これらのファイルは削除しよう。

プロジェクトの新規作成

いよいよプロジェクトの新規作成だ。既存のコードを基に作成することにする。


プロジェクトのルートとなるディレクトリを選択。libフォルダをプロジェクト共有のライブラリフォルダとして選択。


続いてソースやライブラリ、webの場所を指定。ただし、自動で判断してくれる。ディレクトリ名やその直下の構成物等から推測してくれているのだろうか。NetBeansは頭がよろしい。ここではテストパッケージフォルダに追加する。追加ボタンを押して、「test」というディレクトリを作成してそれを選択するだけ。


これでプロジェクトの作成は終わり。


バグとの遭遇

あれ?web.xmlの構文に問題があるみたい。

具体的にわかりたいので右クリックメニューからXMLの妥当性検査をする。どうやらスキーマロケーションがミスってるっぽい。そういやSAStrutsにも同様の問題があったな・・・。こういう不具合はまっとうなアプリケーションサーバー(ようはTomcat以外)だとほぼデプロイ時にはねられるので今のうちに直す。

参考:http://d.hatena.ne.jp/shin/20080505/p2


というか、JavaSE6が必須なのにServlet2.4が対象ってすごいちぐはぐ感が。一応アノテーション等J2SE5.0の構文を対応したのは2.5から。Servlet2.5にあげたほうが問題は少なそう。というか、付属させているServletAPIは2.5だよね。ここのバージョン選択もミスかな。

というわけでどうせ訂正するならxmlのバージョンもあげてみる。xmlの先頭部分を以下のソースに置き換える。

<web-app version="2.5" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

実行

実行。問題なく動いた。

ただ、「Twitter public timeline」だけはTomcatだとエラーになる。Glassfishだと問題ない。

javax.servlet.ServletException: commons.exception.ForwardDispatchRuntimeException: [ECMN0028]フォワード処理に失敗しました(理由:null).
org.t2framework.handler.impl.GlobalExceptionHandlerImpl.handleException(GlobalExceptionHandlerImpl.java:41)
org.t2framework.filter.T2Filter.doFilter(T2Filter.java:142)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

原因

commons.exception.ForwardDispatchRuntimeException: [ECMN0028]フォワード処理に失敗しました(理由:null).
commons.util.ServletUtil.forward(ServletUtil.java:32)
org.t2framework.contexts.impl.RequestImpl.forward(RequestImpl.java:158)
org.t2framework.contexts.WebContext.forward(WebContext.java:67)
org.t2framework.navigation.Forward.forward(Forward.java:69)
org.t2framework.navigation.Forward.execute(Forward.java:55)
org.t2framework.filter.T2Filter.doFilter(T2Filter.java:137)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)


以上駆け足でしたが、1時間ほどさわっただけですが、Netbeans6.1で問題なく動くことを確認しました。アプリケーションサーバーはTomcat 6とGlassfish V2とで動作確認しました。