[Seasar-user:7380] HotDeploy推奨パッケージ構成以外でImplクラスをDIする方法を教えてください。

ryota [E-MAIL ADDRESS DELETED]
2007年 4月 22日 (日) 05:21:34 JST


お世話になります。ryotaです。

昨日メールを送ったのですが届いてなかったようですので、
再送します。もし重複して届いてしまったら申し訳ありません。

ローカルサーバー上でHotDeployが動くサンプルが
S2StrutsExample-V1.3.0-beta
の中にあり、早速動かしてみましたところ、サーバー再起動せずに
クラスの修正が反映されて感動しました。

このS2Strutsのサンプルでは、HotDeployで推奨されている
ルートパッケージが「org.seasar.struts.examples.employee」
になっており、Employeeテーブルのマスタをメンテナンス
することができます。

そこで疑問点が出てきたため質問させてください。

【質問】
org.seasar.struts.examples.employee以外のパッケージにも
org.seasar.struts.examples.employee以下の構成でクラスを作り、
自動でImplクラスをDIする方法はありますでしょうか?

【質問の背景】
現在のプロジェクトでは、
org.seasar.struts.examples.login
org.seasar.struts.examples.logout
org.seasar.struts.examples.createemployee

といったユースケースごとにパッケージを作成し、
そのパッケージの中にaction,dto,service,logicなどの
パッケージを含ませるようにしています。

そこでconvention.dicomに登録するルートパッケージ名を
<arg>"org.seasar.struts.examples.employee"</arg>
から
<arg>"org.seasar.struts.examples"</arg>
へ変更したのですが、HotDeploy機能は
org.seasar.struts.examples.login
org.seasar.struts.examples.logout
org.seasar.struts.examples.createemployee
全てにおいてうまく言ったのですが、
org.seasar.struts.examples.login.logic.impl.LoginLogicImplクラスを作り、
org.seasar.struts.examples.login.logic.impl.LoginActionクラスで自動でLoginLogicImplを
自動DIしようとするプログラムを書くとサーバー起動時に下記の例外が出てきます。

007-04-21 17:15:17,953 [main] ERROR
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/XXXSystem]
- action: null
java.lang.IllegalArgumentException:
org.seasar.struts.examples.login.logic.impl.LoginLogicImpl
       at org.seasar.framework.convention.impl.NamingConventionImpl.toInterfaceClassName(NamingConventionImpl.java:485)
       at org.seasar.framework.convention.impl.NamingConventionImpl.fromClassNameToComponentName(NamingConventionImpl.java:348)
       at org.seasar.framework.container.creator.ComponentCreatorImpl.createComponentDef(ComponentCreatorImpl.java:236)
       at org.seasar.framework.container.hotdeploy.HotdeployBehavior.createComponentDef(HotdeployBehavior.java:108)
       at org.seasar.framework.container.hotdeploy.HotdeployBehavior.getComponentDef(HotdeployBehavior.java:87)
       at org.seasar.framework.container.impl.S2ContainerBehavior$DefaultProvider.acquireFromHasComponentDef(S2ContainerBehavior.java:101)
       at org.seasar.framework.container.impl.S2ContainerBehavior.acquireFromHasComponentDef(S2ContainerBehavior.java:53)
       at org.seasar.framework.container.impl.S2ContainerImpl.hasComponentDef(S2ContainerImpl.java:405)
       at org.seasar.struts.lessconfig.config.rule.impl.DefaultActionFormNamingRule.toActionFormName(DefaultActionFormNamingRule.java:75)
       at org.seasar.struts.lessconfig.autoregister.impl.ActionFormConfigCreatorImpl.createFormBeanConfig(ActionFormConfigCreatorImpl.java:62)
       at org.seasar.struts.lessconfig.autoregister.impl.StrutsConfigRegisterImpl.registerActionForm(StrutsConfigRegisterImpl.java:88)
       at org.seasar.struts.lessconfig.autoregister.impl.StrutsConfigRegisterImpl.registerActionForms(StrutsConfigRegisterImpl.java:83)
       at org.seasar.struts.lessconfig.autoregister.impl.StrutsConfigRegisterImpl.register(StrutsConfigRegisterImpl.java:75)
       at org.seasar.struts.lessconfig.plugin.AutoStrutsConfigRegisterPlugIn.register(AutoStrutsConfigRegisterPlugIn.java:101)
       at org.seasar.struts.lessconfig.plugin.AutoStrutsConfigRegisterPlugIn.init(AutoStrutsConfigRegisterPlugIn.java:80)
       at org.apache.struts.action.ActionServlet.initModulePlugIns(ActionServlet.java:884)
       at org.apache.struts.action.ActionServlet.init(ActionServlet.java:356)
       at javax.servlet.GenericServlet.init(GenericServlet.java:212)
       at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1139)
       at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:966)
       at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3956)
       at org.apache.catalina.core.StandardContext.start(StandardContext.java:4230)
       at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
       at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
       at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
       at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
       at org.apache.catalina.core.StandardService.start(StandardService.java:448)
       at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
       at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
       at java.lang.reflect.Method.invoke(Unknown Source)
       at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
       at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)


org.seasar.struts.examples.login.logic.impl.LoginLogicImplのクラスを
org.seasar.struts.examples.login.logic.impl.LoginLogicImplaaaなどにリネームすると
上記のエラーが消えます。


そこで上記にも書きましたが、
org.seasar.struts.examples.employee以外のパッケージにも
org.seasar.struts.examples.employee以下の構成でクラスを作り、
自動でImplクラスをDIする方法はありますでしょうか?

すみませんが、ご回答よろしくお願いいたします。



Seasar-user メーリングリストの案内