1. 無料アクセス解析

crossroad's Blog

Javaを中心にした技術ネタなど。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

StrutsのActionServletはload-on-startupが必須

Struts(S2Struts)を使ったWebアプリケーション開発でのトラブル事例。

S2StrutsでWebアプリを作っていたのですが、画面にアクセスした際に、


 javax.servlet.ServletException:
  ActionMappingsまたはActionFormBeansコレクションが見つかりません
   org.apache.jasper.runtime.PageContextImpl
   .doHandlePageException(PageContextImpl.java:858)




 java.lang.NullPointerException
   org.apache.struts.taglib.html.JavascriptValidatorTag
   .renderJavascript(JavascriptValidatorTag.java:367)

が発生しました。
struts-config.xmlの書き方か、S2Strutsの使い方が悪いのかと
試行錯誤すること約半日。。。

冷静に見てみると、発生する時と発生しない時があり、違いは何かと考えてみると、
特定の画面(JSP)に直接アクセスしたか、別画面からアクション経由で
遷移してきたかの違いがありました。
エラーが発生したのは直接アクセスした場合だけです。

また、上記スタックトレースからStrutsのソースコードを遡ると、
ModuleConfigオブジェクトが生成されていないことがわかりました。

以上2点を踏まえると。。。ActionServletが初期化されているかいないか
に原因がある
と思いつきました。

で、web.xmlを見直してみると。。。ActionServletのload-on-startup要素がない。
その為、Actionが実行されるまでActionServletが初期化されず、
Actionを実行せずに画面に直接アクセスすると、ModuleConfigオブジェクトがnullになっていたのでした。

対応として、以下のようにload-on-startupを指定すると解決しました。

 <servlet>
  <servlet-name>s2container</servlet-name>
  <servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
  <init-param>
   <param-name>configPath</param-name>
   <param-value>sample/app.dicon</param-value>
  </init-param>
  <init-param>
   <param-name>debug</param-name>
   <param-value>true</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.seasar.struts.servlet.S2ActionServlet</servlet-class>
  <init-param>
   <param-name>config</param-name>
   <param-value>/WEB-INF/struts-config.xml</param-value>
  </init-param>
  <init-param>
   <param-name>debug</param-name>
   <param-value>2</param-value>
  </init-param>
  <init-param>
   <param-name>detail</param-name>
   <param-value>2</param-value>
  </init-param>
  <load-on-startup>2</load-on-startup>
 </servlet>

S2ContainerServletが先に初期化されるように、load-on-startupの
番号を付与する
点だけ要注意です。

関連記事
スポンサーサイト

テーマ:JAVA - ジャンル:コンピュータ

  1. 2006/09/23(土) 00:25:02|
  2. ソフトウェア開発 Seasar
  3. | トラックバック:0
  4. | コメント:0
<<iPod対応カーステレオ | ホーム | Type safe EnumをS2Daoで永続化する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://bagineer.blog59.fc2.com/tb.php/40-960deaa1
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

crossroad

Author:crossroad
関西在住。男。
フリーランスのソフトウェアエンジニア。
エレキベース(Rock&Roll)とお酒が好物でございます。

カテゴリー

タグリスト

Java F1 フリーランス ベーシスト HARRY TheStreetSliders iPhone FX お酒 Seasar Maven eclipse Wicket マイホーム 野球 プロジェクトファシリテーション Rails Ruby UML お店 ソフトウェア Tomcat S2Flex2 jsf Teeda Eclipse タグライブラリ ajax タスク europa mylyn trac 

ブログ内検索

最近の記事

最近のコメント

最近のトラックバック

カレンダー

04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -

月別アーカイブ

全ての記事を表示する

全ての記事を表示する

Twitter


RSSフィード

リンク

このブログをリンクに追加する

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。