トップ «前の日記(2006-06-06 (Tue)) 最新 次の日記(2006-06-09 (Fri))» 編集

ふたつの川うるおう日記


2006-06-07 (Wed)

_ [Seasar] S2Struts HotDeployでActionConfigのパス修正への道 (4)

前回の「HogeAction#setHogeService(HogeServuce hogeService)が動かなくて、HogeAction#setAaa_HogeService(HogeServuce hogeService)なら動く」ってのは、納得しました。HotDeployする時は、先にクラスを登録するわけじゃなく、後からコンポーネント名で探しに行くのでこうなるのか。HotDeployの仕組みの理解が足りない。

というわけで、クラスを探す機能を作れば上手く行くのかな。クラスを探す方法を探そう。

[追記] そんなわけでこんな感じでできた

  • QualifiedInterfaceCentricSinglePackageCreator.java 抜粋
    • Filterは名前そのままの機能なので省略
 protected Class getTargetClass(String componentName) {
   String className = composeClassName(componentName);
   try {
     Class clazz = getTargetClass(ClassUtil.forName(className));
     return clazz;
   } catch (ClassNotFoundRuntimeException ce) {
     // 見つからない場合、探します。
     String shortClassName = StringUtil.capitalize(componentName);
     FileFilter filter = new ShortClassNameFileFilter(shortClassName);
     StringBuffer sb = new StringBuffer(100);
     super.concatName(sb, super.getRootPackageName());
     super.concatName(sb, super.getMiddlePackageName());
     String packageName = sb.toString().replaceAll("\\.", "/");
     ClassLoader loader = Thread.currentThread().getContextClassLoader();
     String classPath = "";
     try {
       Enumeration enumeration = loader.getResources(packageName);
       for (; enumeration != null && enumeration.hasMoreElements();) {
         URL classRootUrl = (URL)enumeration.nextElement();
         File root = new File(classRootUrl.getPath());
         classPath = findClassPath(root, filter);
         if (classPath != null) {
           classPath = classPath.replace(root.getPath(), "");
           classPath = classPath.replace(".class", "");
           classPath = classPath.replace(File.separator, ".");
           className = sb.toString() + classPath;
           return getTargetClass(ClassUtil.forName(className));
         }
       }
     } catch (IOException ie) {
       return null;
     }
   }
   return null;
 }

 private String findClassPath(File root, FileFilter filter)
     throws IOException {
   File[] files = root.listFiles(filter);
   if (files.length > 0) {
     return files[0].getPath();
   } else {
     files = root.listFiles(DirectoryFilter.INSTANCE);
     for (int i = 0; i < files.length; i++) {
       String classPath = findClassPath(files[i], filter);
       if (classPath != null) {
         return classPath;
       }
     }
   }
   return null;
 }

HogeAction#setHogeService(HogeServuce hogeService)で動きました。

| Bookmark:

_ [Seasar] S2Struts HotDeployでActionConfigのパス修正への道 (5)

次、extends AbstractHogeLogicしてる時の問題。これが解ければ動く気がする。

java.lang.IllegalStateException: interface org.seasar.server.members.logic.AbstractMembersLogic
   at org.seasar.framework.container.hotdeploy.OndemandBehavior.registerMap(OndemandBehavior.java:190)
   at org.seasar.framework.container.hotdeploy.OndemandBehavior.registerByClass(OndemandBehavior.java:177)
   at org.seasar.framework.container.hotdeploy.OndemandBehavior.register(OndemandBehavior.java:169)
   at org.seasar.framework.container.hotdeploy.creator.AbstractOndemandCreator.loadComponentDef(AbstractOndemandCreator.java:111)
   at org.seasar.framework.container.hotdeploy.OndemandBehavior.loadComponentDef(OndemandBehavior.java:137)
   at org.seasar.framework.container.hotdeploy.OndemandBehavior.definedClass(OndemandBehavior.java:102)
   at org.seasar.framework.container.hotdeploy.HotdeployClassLoader.definedClass(HotdeployClassLoader.java:93)
   at org.seasar.framework.container.hotdeploy.HotdeployClassLoader.loadClass(HotdeployClassLoader.java:68)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   at java.lang.ClassLoader.loadClassInternal(Unknown Source)
   at java.lang.Class.forName0(Native Method)
   at java.lang.Class.forName(Unknown Source)
   at org.seasar.framework.util.ClassUtil.forName(ClassUtil.java:71)
   ...

と、思ったら違うのもあった。

java.lang.LinkageError: loader constraints violated when linking org/seasar/server/members/dto/PosixAccountDto class
  at java.lang.Class.getDeclaredConstructors0(Native Method)
  at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
  at java.lang.Class.getConstructors(Unknown Source)
  at org.seasar.framework.container.assembler.AutoConstructorAssembler.getSuitableConstructor(AutoConstructorAssembler.java:50)
  at org.seasar.framework.container.assembler.AutoConstructorAssembler.doAssemble(AutoConstructorAssembler.java:39)
  at org.seasar.framework.container.assembler.AbstractConstructorAssembler.assemble(AbstractConstructorAssembler.java:50)
  at org.seasar.framework.container.deployer.PrototypeComponentDeployer.deploy(PrototypeComponentDeployer.java:37)
  at org.seasar.framework.container.impl.ComponentDefImpl.getComponent(ComponentDefImpl.java:99)
  at org.seasar.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:107)
  at org.seasar.framework.container.assembler.AbstractBindingTypeDef.bindAuto(AbstractBindingTypeDef.java:124)
  at org.seasar.framework.container.assembler.BindingTypeShouldDef.doBind(BindingTypeShouldDef.java:51)
  at org.seasar.framework.container.assembler.AbstractBindingTypeDef.bind(AbstractBindingTypeDef.java:69)
  at org.seasar.framework.container.assembler.AutoPropertyAssembler.assemble(AutoPropertyAssembler.java:60)
  at org.seasar.framework.container.deployer.RequestComponentDeployer.deploy(RequestComponentDeployer.java:68)
  at org.seasar.framework.container.impl.ComponentDefImpl.getComponent(ComponentDefImpl.java:99)
  at org.seasar.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:107)
  at org.seasar.framework.container.assembler.AbstractBindingTypeDef.bindAuto(AbstractBindingTypeDef.java:124)
  at org.seasar.framework.container.assembler.BindingTypeShouldDef.doBind(BindingTypeShouldDef.java:51)
  at org.seasar.framework.container.assembler.AbstractBindingTypeDef.bind(AbstractBindingTypeDef.java:69)
  at org.seasar.framework.container.assembler.AutoPropertyAssembler.assemble(AutoPropertyAssembler.java:60)
  at org.seasar.framework.container.deployer.RequestComponentDeployer.deploy(RequestComponentDeployer.java:68)
  at org.seasar.framework.container.impl.ComponentDefImpl.getComponent(ComponentDefImpl.java:99)
  at org.seasar.struts.pojo.MethodBinding.invoke(MethodBinding.java:62)
  at org.seasar.struts.pojo.MethodBinding.invoke(MethodBinding.java:54)
...
| Bookmark:
[]

| Return to page top | Vicuna CMS - WordPress Theme - Vicuna Ninja Style for tDiary |