ExportXMLWordPrintable

    • 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);
               }
      

      よろしくお願いします。

            Assignee:
            kimura
            Reporter:
            jfut
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved: