DTO が DI されない
今回も社内ツール作ってて気がついたこと。
ユーザ情報を格納しておくような DTO を作って、インスタンスはセッション固有で持ち回りたいなと思ったので、下のようなコード書いたんですよ。
@Component(instance = InstanceType.SESSION) public class UserDto implements Serializable { private static final long serialVersionUID = 1L; String userId; // getter/setter 省略 }
public class TestPage { UserDto dto; String userId; public Class prerender() { userId = dto.getUserId(); return null; } // getter/setter とか省略 }
Seasar の ML でも過去に DTO をセッションに乗っけるとかいう話もあるし、うまくいくんじゃないかなと思ってやったんですが…
ぬるぽで落ちました\(^o^)/
なんか DI されてないっぽいんですが・・・このやり方って実はおかしいんでしょうか?
ちなみに @Binding(bindingType = BindingType.MUST) してやると、
org.seasar.framework.container.IllegalAutoBindingPropertyRuntimeException: [ESSR0080]クラス(test.web.test.TestPage$$EnhancedByS2AOP$$1944ae)のプロパティ(dto)の自動設定に失敗しました at org.seasar.framework.container.assembler.BindingTypeMustDef.doBind(BindingTypeMustDef.java:46) 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:55) 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.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:129) at org.seasar.teeda.core.util.DIContainerUtil.getComponent(DIContainerUtil.java:53) at org.seasar.teeda.extension.html.impl.HtmlComponentInvokerImpl.invoke(HtmlComponentInvokerImpl.java:154) at org.seasar.teeda.extension.html.impl.HtmlComponentInvokerImpl.invokeInitialize(HtmlComponentInvokerImpl.java:130) at org.seasar.teeda.extension.render.TViewRootRenderer.invoke(TViewRootRenderer.java:303) at org.seasar.teeda.extension.render.TViewRootRenderer.encodeBegin(TViewRootRenderer.java:140) at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:330) (以下省略)
って出ます。
あ、環境はついさっきリリースされた Seasar 2.4.18-rc4 です。
会社では Seasar 2.4.18-rc2 でも出ました。