ActionFormがうまく動かない(解決済み)

1.0.3-rc1からはActionForm推奨になっているので使うことにしている。

  1. カレンダーから「登録済みスケジュール選択(クリック)」→ スケジュール内容確認画面に遷移
  2. 確認画面で編集ボタンクリック→編集画面に遷移(もしくは削除ボタンクリック→削除してカレンダー画面に遷移)

という画面遷移をするので、@Component(instance = InstanceType.SESSION)を指定してセッションで管理するようにしている。が、これが動かないのだ。
正確に言うと、1.を一回してしまうと、2.でエラー(500)がでる。

HTTPステータス 500 - パス /schedule に対するアクションのインスタンスがありません

あとは何をしてもダメ。ログアウトしたらまた「1回」だけは成功する。1回目は成功するってことなので、アクションのインスタンスがないなんてことはないはずなのだ(1回目も2回目も同じアクションだから)

2008-07-27 21:39:15,592 [DEBUG] HOT deployを開始します
2008-07-27 21:39:15,654 [DEBUG] クラス(kizashi.scheduler.action.ScheduleAction[scheduleAction])のコンポーネント定義を登録します
2008-07-27 21:39:15,763 [DEBUG] クラス(kizashi.scheduler.form.ScheduleForm[scheduleForm])のコンポーネント定義を登録します
2008-07-27 21:39:15,779 [DEBUG] クラス(kizashi.scheduler.dto.UserDto[userDto])のコンポーネント定義を登録します
2008-07-27 21:20:01,998 [http-8080-Processor23] ERROR org.apache.struts.action.RequestProcessor - パス /schedule に対するアクションのインスタンスがありません
org.seasar.framework.exception.SIllegalArgumentException: [ESSR0094]IllegalArgumentExceptionがクラス(kizashi.scheduler.action.ScheduleAction)の型(class kizashi.scheduler.form.ScheduleForm)のフィールド(scheduleForm)に型(kizashi.scheduler.form.ScheduleForm)の値(kizashi.scheduler.form.ScheduleForm@1681629[

])を設定するときに発生しました。対象のクラスは(kizashi.scheduler.action.ScheduleAction$$EnhancedByS2AOP$$6abd0b)です。
at org.seasar.framework.util.FieldUtil.set(FieldUtil.java:164)
at org.seasar.framework.container.assembler.AbstractBindingTypeDef.setValue(AbstractBindingTypeDef.java:346)
at org.seasar.framework.container.assembler.AbstractBindingTypeDef.bindAuto(AbstractBindingTypeDef.java:151)
at org.seasar.framework.container.assembler.BindingTypeMustDef.doBind(BindingTypeMustDef.java:45)
at org.seasar.framework.container.assembler.AbstractBindingTypeDef.bind(AbstractBindingTypeDef.java:91)
at org.seasar.framework.container.assembler.AccessTypeFieldDef.bind(AccessTypeFieldDef.java:50)
at org.seasar.framework.container.assembler.AccessTypeFieldDef.bind(AccessTypeFieldDef.java:42)
at org.seasar.framework.container.assembler.AutoPropertyAssembler.assemble(AutoPropertyAssembler.java:56)
at org.seasar.framework.container.deployer.RequestComponentDeployer.deploy(RequestComponentDeployer.java:67)
at org.seasar.framework.container.impl.ComponentDefImpl.getComponent(ComponentDefImpl.java:111)
at org.seasar.struts.config.S2ActionMapping.getAction(S2ActionMapping.java:312)
at org.seasar.struts.action.ActionWrapper.(ActionWrapper.java:74)
at org.seasar.struts.action.S2RequestProcessor.processActionCreate(S2RequestProcessor.java:236)
at org.seasar.struts.action.S2RequestProcessor.process(S2RequestProcessor.java:120)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:399)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at org.seasar.struts.filter.RoutingFilter.forward(RoutingFilter.java:196)
at org.seasar.struts.filter.RoutingFilter.doFilter(RoutingFilter.java:82)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:63)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:69)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.valves.FastCommonAccessLogValve.invoke(FastCommonAccessLogValve.java:482)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:548)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(Unknown Source)
at java.lang.reflect.Field.set(Unknown Source)
at org.seasar.framework.util.FieldUtil.set(FieldUtil.java:159)

どうやら、遷移時のActionFormをActionにDI(?)してくれているタイミングで落ちているようだ。スコープをSESSIONからREQUESTにしたらうまく画面遷移はできる(セッションを前提にしてるので、表示は歯抜けになってしまうが)

自分が書いたコードでないところで落ちるとさすがに調査に時間がかかる。ま、勉強になるのでいいが、実プロジェクトだとリスクだなぁと思う。

スケジューラは8割は完成している。
さらすのは恥ずかしいけど、フィードバックを受けられるのならいいのかなとも思い始めている。

追記:

ScheduleForm のフィールドやそこからたどれるフィールドは全部 Serializable でしょうか? シリアライズできないフィールドがあるなら transient を付ける必要があります.

2008-07-27

ビンゴでした。