CoolDeployに失敗する件
デプロイモードをHotDeployからCoolDeployにしたら、DIコンテナの初期化に失敗する。とりあえず解決しているが、なんだか変なことをしている気がして落ち着かない。
問題
今作っているアプリケーションではコンポーネントの自動登録を行っているのだが、そこで落ちる。
org.seasar.framework.beans.IllegalPropertyRuntimeException: [ESSR0059]クラス(org.seasar.framework.container.autoregister.ComponentAutoRegister)のプロパティ(customizer)の設定に失敗しました。理由はorg.seasar.framework.container.TooManyRegistrationRuntimeException: [ESSR0045]interface org.seasar.framework.container.ComponentCustomizerに複数のコンポーネント(org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain)が登録されています
カスタマイザがたくさんあって、どれを使っていいかわからないらしい。
customizer.diconは空っぽなのだが、そこからincludeしているdefault-customizer.diconでいくつかカスタマイザが登録されている。複数のカスタマイザを登録しているのだから、どれを使ってよいものやら、となるわけである。しかし、それならなぜHotDeployでは問題無く初期化できるのだろうか。
同様の問題については、メーリングリストのログに一つだけ触れているものがあった。
[Seasar-user:14040] [teeda] JarファイルのDaoを自動登録しようとしているのですがうまく行きません
しかし、別のやり方が提示されて解決になっており、根本的な原因については触れられていない。
一番核心に迫っているのは、これだろうか。
[Seasar-user:9026] Re: CoolDeploy 時に登録されないコンポーネント
このログによると、そもそもエラーになるべきところがHotDeployだとならないケースがある、ということらしい。うーむ。
とりあえず解決編
で、どうやって解決したかというと、空っぽだったcustomizer.diconに、カスタマイザを追加したのである。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="default-customizer.dicon"/> <!-- コレを足した。名前はデフォルトカスタマイザのものを適当に。 --> <component name="serviceCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"/> </components>
これで初期化できるようになる。ただ、これだとカスタマイザを複数登録した場合に問題が再発する。
または、ComponentAutoRegisterのcustomizerプロパティに適当なカスタマイザ、ないしnullを渡してもいい。
<component class="org.seasar.framework.container.autoregister.ComponentAutoRegister"> <property name="customizer">null</property> <property name="instanceDef"> @org.seasar.framework.container.deployer.InstanceDefFactory@OUTER </property>
とにかく、どのカスタマイザを使うのか明確にしてやればよいわけだ。
しかし、これはなんかトリッキーな対処っぽいなぁ。SMART Deployを使う場合は自動登録はcreatorにでも任せて自分ではやるなということだろうか。それだとcreatorやらcustomizerやらを自作することになって面倒なのだが。よくわからん。