-
Type: Bug
-
Resolution: Won't Fix
-
Priority: Major
-
None
-
Affects Version/s: None
-
Component/s: S2Struts
-
None
-
Environment:s2-framework-2.4.0-rc-1
org.seasar.struts.pojo.util.BindingUtil#importProperty()でコンポーネント名を使ってコンポーネントを探すと、HOT deploy時にサブアプリケーションのServiceクラスのコンポーネント名がuser_LoginServiceとなっているので下記のsetterでは見つけられないようです。COOL deploy時には問題ありませんでした。
public void setLoginService(LoginService loginService)
発生する例外です。
org.seasar.framework.container.ComponentNotFoundRuntimeException: [ESSR0046]コンポーネント(loginService)が見つかりません at org.seasar.framework.container.hotdeploy.creator.MultiPackageOndemandCreator.getTargetClass(MultiPackageOndemandCreator.java:85) at org.seasar.framework.container.hotdeploy.creator.AbstractOndemandCreator.getComponentDef(AbstractOndemandCreator.java:152) at org.seasar.framework.container.hotdeploy.impl.OndemandProjectImpl.getComponentDef(OndemandProjectImpl.java:67) at org.seasar.framework.container.hotdeploy.OndemandBehavior.getComponentDef(OndemandBehavior.java:134) at org.seasar.framework.container.hotdeploy.OndemandBehavior.getComponentDef(OndemandBehavior.java:99) 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:409) at org.seasar.struts.pojo.util.BindingUtil.getValue(BindingUtil.java:72) at org.seasar.struts.pojo.util.BindingUtil.importProperty(BindingUtil.java:93) at org.seasar.struts.pojo.util.BindingUtil.importProperties(BindingUtil.java:82) at org.seasar.struts.pojo.MethodBinding.invoke(MethodBinding.java:65) at org.seasar.struts.pojo.MethodBindingAction.execute(MethodBindingAction.java:41) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) ...
下記のsetterだと一応動きますが、ちょっと見た目が良くないです。
public void setUser_LoginService(LoginService user_LoginService)
そこで下記のパッチのようにコンポーネント名ではなく、クラスで探すと最初のsetterで問題ありませんでした。もっと良い別の改善案があるかもしれませんが、とりあえずの案です。
org.seasar.struts.pojo.util.BindingUtil.java
Index: E:/Java/Eclipse/Workspace/Seasar/s2struts/src/main/java/org/seasar/struts/pojo/util/BindingUtil.java =================================================================== --- E:/Java/Eclipse/Workspace/Seasar/s2struts/src/main/java/org/seasar/struts/pojo/util/BindingUtil.java (revision 556) +++ E:/Java/Eclipse/Workspace/Seasar/s2struts/src/main/java/org/seasar/struts/pojo/util/BindingUtil.java (working copy) @@ -63,13 +63,15 @@ return (Class) primitiveMap.get(primitiveClass); } - private static Object getValue(S2Container container, String name) { + private static Object getValue(S2Container container, Class clazz, String name) { Object var = RequestUtil.getValue(S2StrutsContextUtil.getRequest(container), name); if (var != null) { return var; } - if (container.hasComponentDef(name)) { + if (container.hasComponentDef(clazz)) { + return container.getComponent(clazz); + } else if (container.hasComponentDef(name)) { return container.getComponent(name); } return null; @@ -89,8 +91,9 @@ return; } + Class propertyType = propertyDesc.getPropertyType(); String propertyName = propertyDesc.getPropertyName(); - Object value = BindingUtil.getValue(container, propertyName); + Object value = BindingUtil.getValue(container, propertyType, propertyName); if (BindingUtil.isActionFormProperty(propertyDesc, mapping)) { value = ActionFormUtil.getActualForm(S2StrutsContextUtil.getRequest(container), mapping); } else { @@ -100,7 +103,6 @@ return; } - Class propertyType = propertyDesc.getPropertyType(); if (propertyType.isPrimitive()) { propertyType = getPrimitiveWrappedClass(propertyType); }
よろしくお願いします。