ふたつの川うるおう日記
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)で動きました。
_ [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) ...
[ツッコミを入れる]
[]


